Python 中的类常量

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

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


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

我想知道有没有更好的方法或者不用写“禽兽”的方法在尺寸之前。马从动物那里继承。

301020 次浏览

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

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

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


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

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

在 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