Skip to main content
 首页 » 编程设计

python之元 python : Adding Methods to a Class

2025年05月04日13zhenyulu

我想在运行时向类定义中添加一些方法。然而,当运行以下代码时,我得到了一些令人惊讶的(对我来说)结果。

测试.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))