在Python中向类动态添加方法

在Python中向类动态添加方法,python,Python,我正在尝试根据列表向类添加方法 class _Roles(object): """ set the roles for dev, staging and production """ def __init__(self): from types import MethodType steps = ['dev','stage','prod'] for step

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

class _Roles(object):
    """
    set the roles for dev, staging 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)

问题是,当我调用
\u Roles.dev()
\u Roles.stage()
\u Roles.prod()
时,我总是会打印最后一步,即prod,而不是
dev()
等等。这是什么原因?

因为。在单独的范围内定义每个函数。

只需使用
setattr

Foo类:
定义初始值(self,v):
自我评价,自我评价
定义我的新方法(自我):
打印(“self.v=,self.v”)
setattr(Foo,‘print_v’、my_new_方法)
Foo(5).print_v()
输出:

自我评价:v=5


您好,谢谢。在这种情况下,如何在绑定方法之前设置函数的“step”参数?创建另一个作用域。就像在函数中一样。将
步骤传递给。但是MethodType需要一个可调用函数:/因此从该范围返回一个可调用函数。有什么问题吗?还有很多其他的选择,最好的一个是重写代码,这样你就不必一开始就这么做,但是@IgnacioVazquez Abrams有一个正确的答案,如果你真的想这样做的话。我认为如果你只是为不同的角色定义不同的类(可能使用子类化),这将是一个更好的设计。,然后在函数或映射中动态选择正确的类。这里的另一个问题是您在实例上设置的是方法,而不是类。但是这种猴子补丁很难调试和维护。我建议避免使用它。