在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有一个正确的答案,如果你真的想这样做的话。我认为如果你只是为不同的角色定义不同的类(可能使用子类化),这将是一个更好的设计。,然后在函数或映射中动态选择正确的类。这里的另一个问题是您在实例上设置的是方法,而不是类。但是这种猴子补丁很难调试和维护。我建议避免使用它。