D
Dmitry S. Makovey
Hi,
after hearing a lot about decorators and never actually using one I have
decided to give it a try. My particular usecase is that I have class that
acts as a proxy to other classes (i.e. passes messages along to those
classes) however hand-coding this type of class is rather tedious, so I
decided to use decorator for that. Can somebody tell me if what I'm doing
is a potential shot-in-the-foot or am I on the right track? (Note, It's
rather rudimentary proof-of-concept implementation and not the final
solution I'm about to employ so there are no optimizations or
signature-preserving code there yet, just the idea).
Here's the code:
class A:
b=None
def __init__(self,b):
self.val='aval'
self.b=b
b.val='aval'
def mymethod(self,a):
print "A::mymethod, ",a
def mymethod2(self,a):
print "A::another method, ",a
def Aproxy(fn):
def delegate(*args,**kw):
print "%s::%s" % (args[0].__class__.__name__,fn.__name__)
args=list(args)
b=getattr(args[0],'b')
fnew=getattr(b,fn.__name__)
# get rid of original object reference
del args[0]
fnew(*args,**kw)
setattr(A,fn.__name__,delegate)
return fn
class B:
def __init__(self):
self.val='bval'
@Aproxy
def bmethod(self,a):
print "B::bmethod"
print a, self.val
@Aproxy
def bmethod2(self,a):
print "B::bmethod2"
print a, self.val
b=B()
b.bmethod('foo')
a=A(b)
b=B()
b.val='newval'
a.bmethod('bar')
a.bmethod2('zam')
after hearing a lot about decorators and never actually using one I have
decided to give it a try. My particular usecase is that I have class that
acts as a proxy to other classes (i.e. passes messages along to those
classes) however hand-coding this type of class is rather tedious, so I
decided to use decorator for that. Can somebody tell me if what I'm doing
is a potential shot-in-the-foot or am I on the right track? (Note, It's
rather rudimentary proof-of-concept implementation and not the final
solution I'm about to employ so there are no optimizations or
signature-preserving code there yet, just the idea).
Here's the code:
class A:
b=None
def __init__(self,b):
self.val='aval'
self.b=b
b.val='aval'
def mymethod(self,a):
print "A::mymethod, ",a
def mymethod2(self,a):
print "A::another method, ",a
def Aproxy(fn):
def delegate(*args,**kw):
print "%s::%s" % (args[0].__class__.__name__,fn.__name__)
args=list(args)
b=getattr(args[0],'b')
fnew=getattr(b,fn.__name__)
# get rid of original object reference
del args[0]
fnew(*args,**kw)
setattr(A,fn.__name__,delegate)
return fn
class B:
def __init__(self):
self.val='bval'
@Aproxy
def bmethod(self,a):
print "B::bmethod"
print a, self.val
@Aproxy
def bmethod2(self,a):
print "B::bmethod2"
print a, self.val
b=B()
b.bmethod('foo')
a=A(b)
b=B()
b.val='newval'
a.bmethod('bar')
a.bmethod2('zam')