is decorator the right thing to use?

Diez B. Roggisch deets at nospam.web.de
Thu Sep 25 08:45:20 CEST 2008


Dmitry S. Makovey schrieb:
> Dmitry S. Makovey wrote:
>> In my real-life case A is a proxy to B, C and D instances/objects, not
>> just one. 
> 
> forgot to mention that above would mean that I need to have more than one
> decorator function like AproxyB, AproxyC and AproxyD or make Aproxy smarter
> about which property of A has instance of which class etc. 
> 
> Unless I'm totally "out for lunch" and there are better ways of implementing
> this (other than copy-pasting stuff whenever anything in B, C or D
> changes).

__getattr__?

class Proxy(object):


     def __init__(self, delegate):
         self._delegate = delegate


     def __getattr__(self, attr):
         v = getattr(self._delegate, attr)
         if callable(v):
            class CallInterceptor(object):
                  def __init__(self, f):
                      self._f = f

                  def __call__(self, *args, **kwargs):
                      print "Called " + str(self._f) + " with " + 
str(args) + str(kwargs)
                      return self._f(*args, **kwargs)
            return CallInterceptor(v)
         return v


Decorators have *nothing* to do with this. They are syntactic sugar for


def foo(...):
     ...

foo = a_decorator(foo)

Nothing less, nothing more.

Diez



More information about the Python-list mailing list