在python中,我希望一个类有一些“常量”(实际上是变量),它们在所有子类中都很常见。有没有办法用友好的语法来做到这一点? 现在我使用:
class Animal:
SIZES=["Huge","Big","Medium","Small"]
class Horse(Animal):
def printSize(self):
print(Animal.SIZES[1])
我想知道是否有更好的方法可以做到这一点,或者在没有必须写“动物”的情况下做到这一点。之前的尺寸。 谢谢! 编辑:忘了提到马继承自动物。
答案 0 :(得分:113)
由于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)
或者,您可以创建中间类:HugeAnimal
,BigAnimal
等。如果每个动物类都包含不同的逻辑,那将特别有用。
答案 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