【发布时间】:2016-04-25 22:28:54
【问题描述】:
我知道python中有一个叫做decorator的东西,它可以比下面的代码更整洁地完成这项工作。但我只是好奇为什么下面的代码不起作用。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def wrap(old, new):
"Override an existing function."
def repl(*args, **kwargs):
return new(_old=old, *args, **kwargs)
return repl
class MyClass(object):
def foo(self, data):
print data
return data
def bar(self, _old, data):
print 'running foo'
_old(data)
print 'foo completed'
MyClass.foo = wrap(MyClass.foo, bar)
mc = MyClass()
mc.foo('Test Data')
当我运行代码时,我得到了一个错误:
Traceback (most recent call last):
File "./test.py", line 24, in <module>
mc.foo('Test Data')
File "./test.py", line 7, in repl
return new(_old=old, *args, **kwargs)
TypeError: bar() got multiple values for keyword argument '_old'
这里有什么问题?我该如何解决?
【问题讨论】:
-
为什么你的函数
bar有一个参数self? -
问题可能出在“自我”那里,也许这里的答案可以帮助stackoverflow.com/questions/18950054/…
-
@jacob 因为
wrap旨在用bar替换foo。foo有一个参数self,所以bar应该有一个参数self。 -
@trainoasis 无论我是否添加
self,代码都不起作用。