在Python中动态地向类添加方法

时间:2012-10-26 00:36:15

标签: python

我正在尝试根据列表向类添加方法。

class _Roles(object):

""" 
set the roles for dev, stagging and production
"""                         
def __init__(self):         
    from types import MethodType                    
    steps = ['dev','stage','prod']                          
    for step in steps:
        def env_setter(self):                                   
            print step
        method = MethodType(env_setter,self,self.__class__)                                    
        setattr(self,step,method)

问题在于,当我致电_Roles.dev()_Roles.stage()_Roles.prod()时,我总是打印出 prod 的最后一步,而不是 {/ 1}}的开发等等。这是什么原因?

2 个答案:

答案 0 :(得分:2)

因为you use the same scope for all function declarations。在单独的范围内定义每个函数。

答案 1 :(得分:1)

只需使用 setattr :

class Foo:
    def __init__(self, v):
        self.v = v
        
def my_new_method(self):
    print("self.v =", self.v)

setattr(Foo, 'print_v', my_new_method)

Foo(5).print_v()

输出:

<块引用>

self.v = 5