Transfer undefined class methods to attribute's method.

Peter Otten __peter__ at web.de
Mon Feb 9 15:37:31 CET 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