我知道python中循环中的后期绑定,但是我找不到解决此问题的方法。
def bind_method(object, methods):
for method in methods:
def my_method():
result = method()
return result
setattr(object, method.__name__, my_method)
def test():
class A: pass
def bar():
return "BAR"
def foo():
return "FOO"
a = A()
bind_method(a, [bar, foo])
assert a.foo() == "FOO"
assert a.bar() == "BAR"
if __name__ == "__main__":
test()
我尝试了partial
infunctools
但没有成功:(
当调用a.bar()
my_method
被调用并且因为for循环已经结束时,method
for的值是methods
列表中的最后一个元素,因此您总是得到"FOO"
结果。
要检查,您可以添加打印对帐单:
def my_method():
print(method.__name__) # this will always print `foo`
result = method()
但是当我直接设置它时:
def bind_method(object, methods):
for method in methods:
setattr(object, method.__name__, method)
它确实起作用。
使用functools.partial
:
from functools import partial
def bind_method(object, methods):
for method in methods:
def my_method(a_method):
print(a_method.__name__) # this print correct method name
result = a_method()
return result
setattr(object, method.__name__, partial(my_method, method))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句