我想在运行时向类定义中添加一些方法。然而,当运行以下代码时,我得到了一些令人惊讶的(对我来说)结果。
测试.py
class klass(object):
pass
for i in [1,2]:
def f(self):
print(i)
setattr(klass, 'f' + str(i), f)
在命令行上测试时我得到以下信息:
>>> import test
>>> k = test.klass()
>>> k.f1()
2
>>> k.f2()
2
为什么 k.f1() 返回 2 而不是 1?这对我来说似乎有点违反直觉。
笔记
本次测试是在kubuntu机器上使用python3.0完成的。
请您参考如下方法:
这是绑定(bind)的常见问题——您希望在函数内部使用 i 进行早期绑定(bind),而 Python 正在为它进行后期绑定(bind)。您可以通过这种方式强制执行较早的绑定(bind):
class klass(object):
pass
for i in [1,2]:
def f(self, i=i):
print(i)
setattr(klass, 'f' + str(i), f)
或者通过将 f 包装到一个以 i 作为参数的外部函数层:
class klass(object):
pass
def fmaker(i):
def f(self):
print(i)
return f
for i in [1,2]:
setattr(klass, 'f' + str(i), fmaker(i))
