Wrapper objects
Egil M?ller
redhog at takeit.se
Thu Dec 9 09:11:41 EST 2004
Is there any way to create transparent wrapper objects in Python?
I thought implementing __getattribute__ on either the wrapper class or
its metaclass would do the trick, but it does not work for the built
in operators:
class Foo(object):
class __metaclass__(type):
def __getattribute__(self, name):
print "Klass", name
return type.__getattribute__(self, name)
def __getattribute__(self, name):
print "Objekt", name
return object.__getattribute__(self, name)
>>> Foo() + 1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: unsupported operand type(s) for +: 'Foo' and 'int'
>>> Foo().__add__(1)
Objekt __add__
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 8, in __getattribute__
AttributeError: 'Foo' object has no attribute '__add__'
Thus, note that a + b does not do
try:
return a.__add__(b)
except:
return b.__radd__(a)
and neither, as I first thought
try:
return type(a).__add__(a, b)
...
but something along the lines of
try:
return type.__getattribute__(type(a), '__add__')(a, b)
...
So my naive implementation of a wrapper class,
class wrapper(object):
def __init__(self, value, otherdata):
self.value = value
self.otherdata = otherdata
def __getattribute__(self, name):
return getattr(self.value, name)
does not work. Any ideas for a solution?
More information about the Python-list
mailing list