将属性分配给类方法

时间:2019-07-24 20:15:24

标签: python class methods attributes

假设我有一个充当方法容器的类。我有一个配置文件,在字典中列出了这些方法。在一个程序中,我想从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*

我在做什么错了?


作为参考,我尝试了一些链接:

1 个答案:

答案 0 :(得分:1)

当您调用实例时,会调用

__call__。给定c = Circus()c()c.__call__()相同。结果,您试图在定义属性之前检查该属性。此外,在__call__方法内部,尚未定义clownlion。它们都是类属性,需要按原样使用(即Circus.clownself.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 为第一个参数。一些建议的修复程序,具体取决于您实际要完成的任务:

  1. 使方法成为类方法或静态方法,从而不需要其他参数。

  2. 将绑定的方法存储在字典中:

    c = Circus()
    circus = {
        'funny_thing': c.clown,
        'unfunny_thing': c.lion
    }
    
相关问题