[EMAIL PROTECTED] wrote: > Hi, > > I have a container class A and I want to add functionality to it by > using a decorator class B, as follows: > > class A(object): > def __len__(self): > return 5 > > class B(object): > def __init__(self, a): > self._a = a > > def __getattr__(self, attr): > return getattr(self._a, attr) > > def other_methods(self): > blah blah blah > > I was expecting len(B) to return 5 but I get > AttributeError: type object 'B' has no attribute '__len__' > instead. > I was expecting len() to call B.__len__() which would invoke > B.__getattr__ to call A.__len__ but __getattr__ is not being called. > I can work around this, but I am curious if anyone knows _why_ > __getattr__ is not being called in this situation. > > Thanks > Tim >
You will need a metaclass with a __len__ class attribute class longmeta(type): def __len__(cls): return 7 class A(object): __metaclass__ = longmeta pass py> class longmeta(type): ... def __len__(cls): ... return 7 ... py> class A(object): ... __metaclass__ = longmeta ... pass ... py> len(A) 7 James -- James Stroud UCLA-DOE Institute for Genomics and Proteomics Box 951570 Los Angeles, CA 90095 http://www.jamesstroud.com -- http://mail.python.org/mailman/listinfo/python-list