所以我有一个带有方法的类,该方法需要字符串。像这样的东西:
class A():
def func(self, name):
# do some stuff with it
我有有限数量的可能值,例如[val1
,val2
,val2
],所有字符串。我想这样使用它们:
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
的新属性,但是在这种情况下什么也没有发生。有人可以解释为什么会这样吗?
答案 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