154

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

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

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

我想知道是否有更好的方法可以做到这一点,或者无需写“动物”就可以做到这一点。在尺寸之前。马继承自动物。

4

4 回答 4

168

由于Horse是 的子类Animal,因此您可以更改

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等。如果每个动物类都包含不同的逻辑,那将特别有用。

于 2012-05-20T10:46:20.147 回答
25

您可以SIZES通过self.SIZES(在实例方法中)或cls.SIZES(在类方法中)来获取。

在任何情况下,您都必须明确说明在哪里可以找到SIZES. 另一种方法是放入SIZES包含类的模块,但是您需要在单个模块中定义所有类。

于 2012-05-20T09:53:44.847 回答
15
class Animal:
    HUGE = "Huge"
    BIG = "Big"

class Horse:
    def printSize(self):
        print(Animal.HUGE)
于 2012-05-20T09:53:46.550 回答
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
于 2012-05-21T07:28:00.573 回答