如何使用 setattr 创建绑定方法?
How to use setattr to create bound methods?
所以我有一个 class 方法,它接受字符串。像这样的想法:
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
的新属性,但在这种情况下什么也不会发生。谁能解释一下为什么会这样,我该怎么办?
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
所以我有一个 class 方法,它接受字符串。像这样的想法:
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
的新属性,但在这种情况下什么也不会发生。谁能解释一下为什么会这样,我该怎么办?
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