这很难。我不仅想动态地创建方法,还想将decorator与它们关联起来。这就是我试过的
import inspect
import types
class Dynamo(object):
pass
def call_me_dec(func):
print 'I am here'
return func
def add_dynamo(cls,i):
# @call_me_dec
def innerdynamo(self):
print "in dynamo %d" % i
return i
innerdynamo.__doc__ = "docstring for dynamo%d" % i
innerdynamo.__name__ = "dynamo%d" % i
setattr(cls, innerdynamo.__name__, innerdynamo)
def add_decorators(cls):
for name, fn in inspect.getmembers(cls):
if isinstance(fn, types.UnboundMethodType):
setattr(cls, name, call_me_dec(fn))
for i in range(2):
add_dynamo(Dynamo, i)
add_decorators(Dynamo)
d=Dynamo()
d.dynamo0()
d.dynamo1()
输出为:
^{2}$预期产量:
I am here
in dynamo 0
I am here
in dynamo 1
请解释为什么会发生这种情况,我如何才能得到预期的结果?在
您看到的是因为decorator代码是在创建修饰函数时调用的,而不是在调用函数时调用的。如果您想让代码在调用时运行,您需要让decorator返回一个调用decorated方法的可调用(通常是闭包)。例如:
Decorator语法只是语法上的糖。记住:
^{pr2}$相当于
不管是哪种方式,都会在本地命名空间中得到
func
标签,引用从显式定义为deco
传递func
返回的对象。Decorator语法捆绑了一些额外的检查(比如确保与deco
之间的输入和输出始终是可调用的),但是基本上,如果在示例1中某个东西能够以给定的方式工作,那么在示例2中它将以这种方式工作。在相关问题 更多 >
编程相关推荐