变量引用类成员 - Python

时间:2013-12-11 06:13:13

标签: python oop

我正在尝试创建一种方法,将一个前缀应用于一个可以修改项目现有统计数据的项目。例如,在下面的代码中,我试图将'huge'前缀应用于'jar'项。我想让代码可以重复使用,这样我就可以有不同的前缀('fast','healthy')来修改不同的项目统计数据。

  • 是否可以在变量中保存类成员的名称?
    • 如果是的话,我有什么理由不这样做吗?
    • 如果没有,有哪些替代方案?
class Prefix(object):
    def __init__(self, word, stat, valu):
        self.word = word
        self.stat = stat
        self.valu = valu


class Item(object):
    def __init__(self, name, size):
        self.name = name
        self.size = size
    def apply_prefix(self, prefix):
        self.prefix.stat += prefix.valu # <-- Here is my issue
        self.name = prefix.word + ' ' + self.name
        # My hope is to make the code reusable for any stat
    def print_stats(self):
        print self.name, self.size


def main():
    jar = Item('jar', 10)
    huge_prefix = Prefix('huge', 'size', 5)
    jar.apply_prefix(huge_prefix)
    jar.print_stats()

1 个答案:

答案 0 :(得分:1)

您正在尝试动态引用到某个属性。您可以使用getattr执行此操作。如果你想设置属性,那么......那就是setattr:)

def apply_prefix(self, prefix):
    target_attr = getattr(self,prefix.stat) #dynamically gets attr
    setattr(self,prefix.stat,target_attr+prefix.valu)

至于这是否是最好的编码风格:它取决于。在某些情况下,使用getattr可以使代码更加清晰。既然你现在只有两个统计数据,那么需要这种动态属性引用似乎太过分了,因为我可以很容易地做到:

bogus_prefix = Prefix('huge','bogus',3)

哪个是有效Prefix,但在我尝试应用时会抛出AttributeError。这不是调试最直接的事情。

然而,getattr方法有奖励:如果您添加更多统计信息,则无需更改Prefix中的代码(哈哈)。

其他替代方案? Python中有始终选项。 : - )

这样做的方法是让Prefix只是dict个单词:值对。然后apply_prefix将遍历单词键,一次更新尽可能多的值。这是一种类似的动态方法,但可扩展性更强。