【发布时间】:2019-01-08 21:18:12
【问题描述】:
我的 Python 装饰器有问题。
class decorator(object):
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
print('sth to log: %s : %s' % (self.function.__name__, args))
return self.function(*args, **kwargs)
@decorator
def sum_test(a, b):
print('sum: %s' % (a+b))
@decorator
class Class_test(object):
def __init__(self):
pass
def sum_func(self, a, b):
print('class sum: %s' % (a+b))
return a+b
if __name__ == '__main__':
sum_test(3, 4)
func = Class_test()
var1 = func.sum_func(1, 4)
print(var1)
输出:
sth to log: sum_test : (3, 4)
sum: 7
sth to log: Class_test : ()
class sum: 5
5
装饰器正在为函数sum_test 工作。我可以记录该函数 sum_test 与变量 3 和 4 一起使用。
我在装饰课程时遇到了问题。我可以记录 Class_test 类的对象已创建,但我没有使用函数 sum_func 的信息。
为什么在类对象上运行sum_func时没有触发装饰器中的__call__(),而直接在函数sum_test上使用时触发了?
【问题讨论】:
-
旁注:我建议在函数内部使用闭包而不是完整的类。
-
你希望装饰器在应用于类时做什么?是不是要装饰类的每一个方法?
-
一般来说,你不能将相同的装饰器应用到函数和类——尽管通过一些巧妙的编码可能是可能的。
-
我想让装饰器记录哪些函数和类与变量一起使用。我应该有另一个装饰师上课吗?我可以为 sum_func 类的函数再添加一个装饰器吗?