python中的类常量

时间:2012-05-20 09:51:26

标签: python

在python中,我希望一个类有一些“常量”(实际上是变量),它们在所有子类中都很常见。有没有办法用友好的语法来做到这一点? 现在我使用:

class Animal:
    SIZES=["Huge","Big","Medium","Small"]

class Horse(Animal):
    def printSize(self):
        print(Animal.SIZES[1])

我想知道是否有更好的方法可以做到这一点,或者在没有必须写“动物”的情况下做到这一点。之前的尺寸。 谢谢! 编辑:忘了提到马继承自动物。

4 个答案:

答案 0 :(得分:113)

由于HorseAnimal的子类,因此您只需更改

即可
print(Animal.SIZES[1])

print(self.SIZES[1])

但是,您需要记住SIZES[1]意味着“大”,所以您可以通过执行以下操作来改进代码:

class Animal:
    SIZE_HUGE="Huge"
    SIZE_BIG="Big"
    SIZE_MEDIUM="Medium"
    SIZE_SMALL="Small"

class Horse(Animal):
    def printSize(self):
        print(self.SIZE_BIG)

或者,您可以创建中间类:HugeAnimalBigAnimal等。如果每个动物类都包含不同的逻辑,那将特别有用。

答案 1 :(得分:15)

您可以通过SIZES(在实例方法中)或self.SIZES(在类方法中)访问cls.SIZES

无论如何,您必须明确指出在哪里找SIZES。另一种方法是将SIZES放在包含类的模块中,但是您需要在单个模块中定义所有类。

答案 2 :(得分:8)

class Animal:
    HUGE = "Huge"
    BIG = "Big"

class Horse:
    def printSize(self):
        print(Animal.HUGE)

答案 3 :(得分:4)

扩展betabandido的答案,您可以编写一个函数将属性作为常量注入模块:

def module_register_class_constants(klass, attr_prefix):
    globals().update(
        (name, getattr(klass, name)) for name in dir(klass) if name.startswith(attr_prefix)
    )

class Animal(object):
    SIZE_HUGE = "Huge"
    SIZE_BIG = "Big"

module_register_class_constants(Animal, "SIZE_")

class Horse(Animal):
    def printSize(self):
        print SIZE_BIG