假设我有一个充当方法容器的类。我有一个配置文件,在字典中列出了这些方法。在一个程序中,我想从config中导入字典并对其进行迭代,并在进行时从该类中调用方法。
问题是,如果方法是一种,则需要以一种方式处理它们,而如果是另一种,则需要以另一种方式处理它们。所以容器类看起来像:
class Circus(object):
def clown(self):
return print("*HONK*")
def lion(self):
return print("roar")
def __call__(self):
setattr(clown, 'isFunny', True)
setattr(lion, 'isFunny', False)
我的配置文件:
circus = {
'funny_thing': Circus.clown,
'unfunny_thing': Circus.lion
}
以及实际的脚本:
for item in circus.items():
if item[1].isFunny == True:
item()
我已经忘记了所尝试的所有内容,但包括将其分为两个类,并在每个类中创建一个isFunny()方法(返回true或false),将内容分配给__dict__类,放置{{1 }}使用__init __,setattr()
和@staticmethod
。
我期望的是一个简单的@classmethod
,但大多数情况下都会产生一个*HONK*
。
我在做什么错了?
作为参考,我尝试了一些链接:
答案 0 :(得分:1)
__call__
。给定c = Circus()
,c()
与c.__call__()
相同。结果,您试图在定义属性之前检查该属性。此外,在__call__
方法内部,尚未定义clown
和lion
。它们都是类属性,需要按原样使用(即Circus.clown
或self.clown
)。如果要标记方法,只需直接在class
语句中进行标记即可。
class Circus:
def clown(self):
print("*HONK*")
def lion(self):
print("roar")
clown.isFunny = True
lion.isFunny = False
circus = {
'funny_thing': Circus.clown,
'unfunny_thing': Circus.lion
}
for item in circus.items():
if item[1].isFunny:
item[1]()
但是,请注意item[1]()
仍然是错误的,因为未绑定方法仍然期望Circus
的 instance 为第一个参数。一些建议的修复程序,具体取决于您实际要完成的任务:
使方法成为类方法或静态方法,从而不需要其他参数。
将绑定的方法存储在字典中:
c = Circus()
circus = {
'funny_thing': c.clown,
'unfunny_thing': c.lion
}