spell method chaining?

Robin Becker robin at jessikat.fsnet.co.uk
Sat Jun 9 05:25:05 EDT 2001


In article <3B21D830.E823D70F at letterror.com>, Just van Rossum <just at letterror.com> writes
Well what I'm really interested in is dynamically wrapping classes for a property collection.
With a simple ion that's fairly easy, but when the collection is over a class then the wrapper
__getitem__ has to try and chain getattr to either go through the wrapped class or if that fails
to try the collection.

the main code looks like

_ItemWrapper={}

class TypedPropertyCollection(PropHolder):
    def __init__(self, exampleClass):
        #give it same validation rules as what it holds
        self.__dict__['_value'] = exampleClass()
        self.__dict__['_children'] = {}

    def __getitem__(self, index):
        try:
            return self._children[index]
        except KeyError:
            Klass = self._value.__class__
            if _ItemWrapper.has_key(Klass):
                WKlass = _ItemWrapper[Klass]
            else:
                class WKlass(Klass):
                    def __getattr__(self,name):
                        try:
                            return self.__class__.__bases__[0].__getattr__(self,name)
                        except:
                            return getattr(self._parent,name)
                _ItemWrapper[Klass] = WKlass

            child = WKlass()
            child._parent = self
            for i in filter(lambda x,K=child.__dict__.keys(): x in K,child._attrMap.keys()):
                del child.__dict__[i]

            self._children[index] = child
            return child

it currently uses the __bases__ trick for compatibility with earlier python, but that goes wrong
under certain conditions the gen(gen(C)) recursion etc. The nested scopes version would work OK.
-- 
Robin Becker



More information about the Python-list mailing list