wrapping a method function call?

Aaron Brady castironpi at gmail.com
Mon Nov 3 13:53:09 EST 2008


On Nov 3, 3:57 am, m... at pixar.com wrote:
> Steven D'Aprano <ste... at remove.this.cybersource.com.au> wrote:
> > Now you can monkey patch class A if you want. It's probably not a great
> > idea to do this in production code, as it will effect class A everywhere.
>
> This is perfect for me.  The code in question is basically a protocol
> translator... it receives requests over the network, makes some calls,
> and returns the result translated back to the original protocol, so there's
> a single instance of each A,B, etc.
>
> > A.p1 = precall(pre)(postcall(post)(A.p1))
>
> Is there a way to do this for all callable methods of A? e.g.
>
>     for x in callable_methods(A):
>         x = precall(pre)(postcall(post)(x))
>
> Thanks!
> Mark
>
> --
> Mark Harrison
> Pixar Animation Studios

Hi, that sounds like metaclasses.

from types import *
def pre( self, *ar, **kwar ):
    print 'in pre'
def post( self, *ar, **kwar ):
    print 'in post'
class metacls(type):
    def __new__(mcs, name, bases, dict):
        for k, x in dict.items():
            if isinstance( x, FunctionType ):
                def modx( f ):
                    def _mod( *arg, **kwarg ):
                        pre( *arg, **kwarg )
                        retval= f( *arg, **kwarg )
                        post( *arg, **kwarg )
                        return retval
                    return _mod
                dict[ k ]= modx( x )
        return type.__new__(mcs, name, bases, dict)

class A( object ):
    __metaclass__= metacls
    def f( self ):
        print 'in f'

a= A()
a.f()

/Output:

in pre
in f
in post



More information about the Python-list mailing list