我确实了解setattr()
python中的工作原理,但我的问题是当我尝试动态设置属性并为其提供未绑定函数作为值时,因此该属性是可调用的,该属性最终会在我使用未绑定函数的名称时调用attr.__name__
而不是属性的名称。
这是一个例子:
我有一Filter
堂课:
class Filter:
def __init__(self, column=['poi_id', 'tp.event'], access=['con', 'don']):
self.column = column
self.access = access
self.accessor_column = dict(zip(self.access, self.column))
self.set_conditions()
def condition(self, name):
# i want to be able to get the name of the dynamically set
# function and check `self.accessor_column` for a value, but when
# i do `setattr(self, 'accessor', self.condition)`, the function
# name is always set to `condition` rather than `accessor`
return name
def set_conditions(self):
mapping = list(zip(self.column, self.access))
for i in mapping:
poi_column = i[0]
accessor = i[1]
setattr(self, accessor, self.condition)
在上面的类中,set_conditions
函数动态设置 Filter 类的属性 (con
和don
) 并为其分配一个可调用对象,但它们保留了函数的初始名称。
当我运行这个:
>>> f = Filter()
>>> print(f.con('linux'))
>>> print(f.con.__name__)
预期的:
- linux
- con(应该是动态设置属性的名称)
我得到:
- linux
self.condition
条件(属性值的名称(未绑定))
但我希望f.con.__name__
返回属性的名称 ( ) 而不是分配给它con
的未绑定函数的名称 ( )。condition
有人可以向我解释为什么这种行为会这样,我该如何解决?
谢谢。