【发布时间】:2016-07-13 21:46:03
【问题描述】:
以下是我的测试代码,它有一个可以改变自身(当前对象实例)的类方法的装饰器
class Test(object):
def __init__(self):
self.x = 5
def _change_x(self):
print "in _change_x"
def decorator(f):
print "in decorator"
def wrapped(*args, **kwargs):
print "in wrapped"
print args, kwargs
self.x = 8
f(*args, **kwargs)
return wrapped
return decorator
@_change_x
def print_x(self):
print "in print_x, x: %d" % self.x
return self.x
if __name__ == "__main__":
test = Test()
print "Initial value for x: %d" % test.x
print "Test if it changed? x: %d" % test.print_x()
包装在装饰器中的内部方法未被调用。谁能帮我指出我的测试代码中的错误。 我希望在一个类中定义这种装饰器,用于装饰该类中的几个方法,以便在调用时更改类成员。
【问题讨论】:
-
除了装饰器之外,任何人都可以建议我在每次函数调用之前更改类成员(对于该实例)。为了便于阅读,我希望修改不透明,这就是为什么我不在类方法的开头修改它们。
-
我有点难以理解为什么你想在函数调用之前改变事情......我不知道手头的问题,但这似乎是一个不直观的设计模式任何我能想到的用例(诚然,目前还没有用例 ;-))。
-
@mgilson 在许多方法调用之前插入一个额外的步骤是一个非常强大的调试工具。简单的
print f将指示在整个程序过程中的不同点调用了哪些方法。 -
@TadhgMcDonald-Jensen -- 当然,我可以买那个(有点......
pdb恕我直言仍然是一个更好的选择)。但即使在这种情况下,您也没有改变任何东西,只是检查。 -
如果要统计方法被调用的次数怎么办?保留一个 count 属性并在每次调用之前增加它,是的,我知道也有一些有用的工具,但是创建自己的装饰器是控制所采取的操作的最简单方法。