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

Python 如何使用setattr创建绑定方法?,python,decorator,setattr,Python,Decorator,Setattr,所以我有一个类,它有一个方法,它接受字符串。有这样的想法: class A(): def func(self, name): # do some stuff with it a = A() a.val1() # actually a.func(val1) 我有有限数量的可能值,[val1,val2,val2],例如,所有字符串。我想这样使用它们: class A(): def func(self, name): # do some stuf

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

class A():

    def func(self, name):
        # do some stuff with it
a = A()
a.val1() # actually a.func(val1)
我有有限数量的可能值,[
val1
val2
val2
],例如,所有字符串。我想这样使用它们:

class A():

    def func(self, name):
        # do some stuff with it
a = A()
a.val1() # actually a.func(val1)
我尝试将decorators和
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()
不是装饰器,它主要只是一个有副作用的“函数工厂”。另外,正如我在一篇评论中所说,
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
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

如何调用
register
?该装饰程序不返回任何内容部分问题在于
setattr
不知道作为参数传递给它的属性的名称(仅指定给
val
)。您如何调用
register
?装饰程序不会返回任何内容部分问题在于
setattr
不知道作为参数传递给它的属性的名称(仅指定给
val
)。