python中的类常量

nod*_*dwj 112 python

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

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

class Horse(Animal):
    def printSize(self):
        print(Animal.SIZES[1])
Run Code Online (Sandbox Code Playgroud)

而且我想知道是否有更好的方法来做它或者一种方法来做它而不必写"动物".之前的尺寸.谢谢!编辑:忘了提到马继承自动物.

bet*_*ido 118

既然Horse是子类Animal,你可以改变

print(Animal.SIZES[1])
Run Code Online (Sandbox Code Playgroud)

print(self.SIZES[1])
Run Code Online (Sandbox Code Playgroud)

不过,你需要记住这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)
Run Code Online (Sandbox Code Playgroud)

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


Fre*_*Foo 15

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

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


ami*_*mit 9

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

class Horse:
    def printSize(self):
        print(Animal.HUGE)
Run Code Online (Sandbox Code Playgroud)


Mat*_*vor 6

扩展 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
Run Code Online (Sandbox Code Playgroud)