如何将函数转换为绑定方法

2 投票
2 回答
1158 浏览
提问于 2025-04-18 13:29

我有一个类,这个类可以读取一个字符串,并对字符串中的每个字符执行某个特定的操作。我希望这个类能够接受用户自定义的操作,以扩展它的功能。为此,我想把用户提供的函数变成我这个类的绑定方法,这样我就可以像下面这样遍历字符串:

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%的情况下都不推荐使用。

撰写回答