如何将函数转换为绑定方法
我有一个类,这个类可以读取一个字符串,并对字符串中的每个字符执行某个特定的操作。我希望这个类能够接受用户自定义的操作,以扩展它的功能。为此,我想把用户提供的函数变成我这个类的绑定方法,这样我就可以像下面这样遍历字符串:
for x in self.string:
getattr(self, self.actions[x])()
我尝试过这样来为我的类创建新的绑定方法:
class myclass(object):
def __init__(self, additional_actions={}):
self.thing = "value"
for k,v in additional_actions.items():
setattr(self,k,v)
def dummy(self):
print(self.thing)
mydic = {"awesome":dummy}
a = myclass(mydic)
a.awesome()
但是,我遇到了这个错误:
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
a.awesome()
TypeError: dummy() missing 1 required positional argument: 'self'
我该如何把一个普通函数变成绑定方法呢?
2 个回答
1
给单个实例分配方法
import types
a = myclass()
setattr(a, "awesome", types.MethodType(dummy, a))
a.awesome()
给一个类添加方法
setattr(myclass, "awesome", dummy)
a = myclass()
a.awesome()
b = myclass()
b.awesome()
现在每个实例都可以使用相同的方法了
2
你需要把这个功能绑定到类上,而不是类的实例上。如果你想要在每个实例上单独处理,就得用到 types.MethodType
。可以参考这个链接了解更多:https://filippo.io/instance-monkey-patching-in-python/
不过,实际上可能有更好的方法来实现你想做的事情。在Python中,猴子补丁(monkey patching)通常被认为是一个很糟糕的编程方式,99%的情况下都不推荐使用。