我想在运行时向类定义中添加一些方法。但是,在运行以下代码时,我得到一些令人惊讶的结果。

test.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完成的。

最佳答案

这是绑定的常见问题-您希望在函数内部使用i进行早期绑定,而Python正在对其进行后期绑定。您可以通过以下方式强制执行较早的绑定:

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))

关于python - MetaPython:将方法添加到类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1148827/

10-11 20:37