【发布时间】:2016-11-26 05:35:01
【问题描述】:
我正在尝试在 Python 中使用自定义包装器/装饰器,并且我想在一个类中声明一个 inside,以便例如打印属性的快照。我已经尝试了 this question 的东西,但没有成功。
这是我想做的(注意:这段代码不起作用,我在下面解释发生了什么)
class TestWrapper():
def __init__(self, a, b):
self.a = a
self.b = b
self.c = 0
def enter_exit_info(self, func):
def wrapper(*arg, **kw):
print '-- entering', func.__name__
print '-- ', self.__dict__
res = func(*arg, **kw)
print '-- exiting', func.__name__
print '-- ', self.__dict__
return res
return wrapper
@enter_exit_info
def add_in_c(self):
self.c = self.a + self.b
print self.c
@enter_exit_info
def mult_in_c(self):
self.c = self.a * self.b
print self.c
if __name__ == '__main__':
t = TestWrapper(2, 3)
t.add_in_c()
t.mult_in_c()
预期的输出是:
-- entering add_in_c
-- {'a': 2, 'b': 3, 'c': 0}
5
-- exiting add_in_c
-- {'a': 2, 'b': 3, 'c': 5}
-- entering mult_in_c
-- {'a': 2, 'b': 3, 'c': 5}
6
-- exiting mult_in_c
-- {'a': 2, 'b': 3, 'c': 6}
但我这段代码给出了
Traceback (most recent call last):
File "C:\Users\cccvag\workspace\Test\src\module2.py", line 2, in <module>
class TestWrapper():
File "C:\Users\cccvag\workspace\Test\src\module2.py", line 18, in TestWrapper
@enter_exit_info
TypeError: enter_exit_info() takes exactly 2 arguments (1 given)
如果我尝试@enter_exit_info(self) 或@self.enter_exit_info,我会得到NameError。我能做什么?
编辑:
我不需要首先在类中声明装饰器物理上,只要它能够访问此类实例的属性即可。我以为只有在课堂上声明才能做到这一点,Rawing's answer 证明我错了。
【问题讨论】:
-
如果你真的想使用基于类的装饰器,你可以使用类装饰器,但这又是一个单独的独立类。
标签: python python-2.7 wrapper decorator python-decorators