[EMAIL PROTECTED] schrieb:
I am instantiating a class A (which I am importing from somebody
else, so I can't modify it) into my class X.

Is there a way I can intercept or wrape calls to methods in A?
I.e., in the code below can I call

   x.a.p1()

and get the output

    X.pre
    A.p1
    X.post

Many TIA!
Mark


class A:
    # in my real application, this is an imported class
    # that I cannot modify
    def p1(self): print 'A.p1'

class X:
    def __init__(self):
        self.a=A()
    def pre(self): print 'X.pre'
    def post(self): print 'X.post'

x=X()
x.a.p1()

There are a few ways to accompish this. First of all, Python allows monkey-patching. That means you *can* modify it:
import sys


class X(object):
    def foo(self):
        print "foo"


X.foo = lambda self: sys.stdout.write("more than foo")

x = X()
x.foo()


You can of course wrap the old foo instead of replacing it, with something like

def foowrapper(old_foo):

   def _w(self, *args, **kwargs):
       print "wrapped"
       return old_foo(self, *args, **kwargs)

   return _w

X.foo = foowrapper(X.foo)


Alternatively, you can wrap the whole of X into a proxy, based on __getattr__ that will allow you do intercept all delegate calls.


class Wrapper(object):
   def __init__(self, delegate):
       self._delegate = delegate

   def __getattr__(self, name):
       print "accessing", name
       return getattr(self._delegate, name)


Diez



--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to