python中的类常量


128

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

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

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

我想知道是否有更好的方法或者不用写“动物”就能做到。之前的大小。谢谢!编辑:忘记提及马从动物继承。


16
不是一个完整的答案,但如果SIZES永不改变,请绝对使用元组而不是列表。像这样("Huge","Big","Medium","Small")
jamylak

看起来您真的是在这里
Eric

Answers:


141

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


SIZE_BIG = [“ BigOne”,“ BigTwo”]我应该使用这种类型的常量。
洛瓦·奇图姆里

17

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

无论如何,您都必须明确说明在哪里可以找到SIZES。一种替代方法是将SIZES包含类的模块放入,但随后您需要在单个模块中定义所有类。


马确实是动物的子类。实际上,完全可以使用self.SIZES [1]而不是Animal.SIZES [1]。
betabandido

@betabandido:OP纠正了这个问题。将相应地更新答案。
弗雷德·富

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

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

您也可以通过自我访问,例如。“ self.HUGE”或“ self.BIG”。这只能在班级内部进行。
cevaris 2014年

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

print SIZE_BIG下课会一样吗?可以编辑Animal.SIZE_HUGE = 'Small'吗?
十字军
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.