如何使用 setattr 创建绑定方法?

How to use setattr to create bound methods?

所以我有一个 class 方法,它接受字符串。像这样的想法:

class A():

    def func(self, name):
        # do some stuff with it

我有有限数量的可能值,例如,[val1val2val2],所有字符串。我想像这样使用它们:

a = A()
a.val1() # actually a.func(val1)

我尝试结合装饰器和 setattr:

class A():

    def func(self, val):
        # do some stuff with it

    def register(self, val):
        def wrapper(self):
            self.func(val)

        setattr(self, val, wrapper)

所以我可以在 运行 时间内遍历所有可能的值:

a = A()
for val in vals:
    a.register(val)

而且效果为零。通常 setattr 添加值为 None 的新属性,但在这种情况下什么也不会发生。谁能解释一下为什么会这样,我该怎么办?

register() 不是装饰器,它主要是 "function factory" 具有副作用。另外,正如我在评论中所说,setattr() 需要知道分配给该值的名称。

下面是让您的代码正常工作的方法:

class A():

    def func(self, val):
        # do some stuff with it
        print('func({}) called'.format(val))

    def register(self, val, name):
        def wrapper():
            self.func(val)
        wrapper.__name__ = name
        setattr(self, name, wrapper)

vals = 10, 20, 30
a = A()

for i, val in enumerate(vals, 1):
    a.register(val, 'val'+str(i))  # Creates name argument.

a.val1()  # -> func(10) called
a.val2()  # -> func(20) called