我在这个元类decorator中应用的decorator的实现有一个问题,我写道:
def decorateAll(decorator):
class MetaClassDecorator(type):
def __new__(meta, classname, supers, classdict):
for name, elem in classdict.items():
if type(elem) is FunctionType:
classdict[name] = decorator(classdict[name])
return type.__new__(meta, classname, supers, classdict)
return MetaClassDecorator
这是我在其中使用元类的类:
^{pr2}$当我把decorate元类传递给decorate元类时,一切似乎都很好,一个decorator实现如下:
def Counter(fun):
fun.count = 0
def wrapper(*args):
fun.count += 1
print("{0} Executed {1} times".format(fun.__name__, fun.count))
return fun(*args)
return wrapper
但是当我使用这样实现的decorator时:
class Counter():
def __init__(self, fun):
self.fun = fun
self.count = 0
def __call__(self, *args, **kwargs):
print("args:", self, *args, **kwargs)
self.count += 1
print("{0} Executed {1} times".format(self.fun.__name__, self.count))
return self.fun(*args, **kwargs)
我有个错误:
line 32, in __call__
return self.fun(*args, **kwargs)
TypeError: __init__() missing 1 required positional argument: 'initial_amount'
为什么?将两个decorators实现与others函数一起使用不会给我带来问题。我认为问题与我试图修饰的方法是类方法这一事实有关。我错过什么了吗?在
您需要将
Counter
实现为可调用描述符。在描述符上执行__get__
时,模拟将描述符绑定到传递给它的实例。另外,基于每个方法/对象存储计数。在此代码:
生成以下输出:
^{pr2}$它调用描述符的
__call__
方法,通过模拟创建functools.partial
类型的对象的绑定,将计数存储在per方法上。在相关问题 更多 >
编程相关推荐