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
)。