decorating container types (Python 2.4)
James Stroud
jstroud at mbi.ucla.edu
Thu Oct 11 19:03:26 EDT 2007
timaranz at gmail.com 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
More information about the Python-list
mailing list