[英]Assigning attributes to class methods
假设我有一个充当方法容器的类。 我有一个配置文件,在字典中列出了这些方法。 在一个程序中,我想从 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__ 类,将setattr()
放在不同的地方,使用 __init__、 @staticmethod
和@classmethod
。
我期望的是一个简单的*HONK*
,但大多数东西都会吐出一个AttributeError: 'function' object has no attribute 'isFunny'
。
我究竟做错了什么?
作为参考,我尝试过的一些链接:
__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
的实例作为它的第一个参数。 一些建议的修复,取决于您实际尝试完成的内容:
使方法类方法或静态方法,以便不需要额外的参数。
在字典中存储绑定方法:
c = Circus() circus = { 'funny_thing': c.clown, 'unfunny_thing': c.lion }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.