Transfer undefined class methods to attribute's method.
Peter Otten
__peter__ at web.de
Mon Feb 9 09:37:31 EST 2004
Maarten van Reeuwijk wrote:
> Hello,
>
> Maybe I was a little too detailed in my previous post [same title]. I can
> boil down my problem to this: say I have a class A that I encapsulate with
> a class Proxy. Now I just want to override and add some functionality (see
> my other post why). All functionality not defined in the Proxy class
> should be delegated (I can't use inheritance, see other post). It should
> be possible to achieve this using Python's great introspection
> possibilities, but I can't find out how. Any help would be really
> appreciated!
>
> TIA, Maarten
>
> Example (class A and Proxy):
>
> class A:
> def __init__(self):
> pass
>
> def methodA(self):
> pass
>
> def methodB(self):
> pass
>
> def methodC(self):
> pass
>
> class Proxy:
> def __init__(self):
> self.a = A()
>
> # maybe scan the methods in A and not in this class?????
> # setup a hook for undefined methods?
>
> def methodA(self):
> # what I DON'T want:
> return self.a.methodA()
> # and this for every method...
>
>
> # maybe something like this?
> def process_unknownmethod(self, method, args):
> return self.a.method(args)
>
> P = Proxy()
> P.methodA()
> P.methodC()
>
> output:
> Traceback (most recent call last):
> File "group.py", line 36, in ?
> P.methodC()
>
>
>
The __getattr__() method could be helpful for your problem. It's calld for
every missing attribute - not just methods. If you want to set attributes,
there's a corresponding __setattr__() method which is called for *every*
attribute.
Adopting your example:
class A:
def methodA(self):
print "original A"
def methodB(self):
print "original B"
class Proxy:
def __init__(self, wrapped):
self._wrapped = wrapped
def methodA(self):
print "replacement A, internally calling",
return self._wrapped.methodA()
def __getattr__(self, name):
return getattr(self._wrapped, name)
a = A()
p = Proxy(a)
p.methodA()
p.methodB()
Peter
More information about the Python-list
mailing list