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

时间:2019-02-28 13:19:40

标签: python decorator setattr

所以我有一个带有方法的类,该方法需要字符串。像这样的东西:

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的新属性,但是在这种情况下什么也没有发生。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

register()不是装饰器,主要是带有副作用的“功能工厂”。另外,正如我在评论中所说,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
相关问题