【问题标题】:Class constants in pythonpython中的类常量
【发布时间】:2012-05-27 04:42:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不是一个完整的答案,但如果SIZES 永远不会改变,一定要使用元组而不是列表。像这样("Huge","Big","Medium","Small")
  • 看起来你真的很喜欢这里的枚举
  • @jamylak 你的评论似乎很受欢迎,很多人似乎认为它很有价值。你能解释一下它背后的逻辑吗?
  • @dmigo 只是问题是关于常量的问题,并且列表可以变异,所以最好使用不可变的元组。常量不应该改变

标签: python constants


【解决方案1】:

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

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

【讨论】:

  • Horse 确实是 Animal 的子类。实际上,完全可以使用 self.SIZES[1] 而不是 Animal.SIZES[1]。
  • @betabandido:OP 纠正了这个问题。将相应地更新答案。
【解决方案2】:
class Animal:
    HUGE = "Huge"
    BIG = "Big"

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

【讨论】:

  • 您也可以通过自我访问,例如。 “self.HUGE”或“self.BIG”。这只会在类内部起作用。
【解决方案3】:

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

【讨论】:

  • SIZE_BIG=["BigOne","BigTwo"] 我应该使用这种类型的常量吗?
【解决方案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'
猜你喜欢
  • 1970-01-01
  • 2020-05-11
  • 2014-11-21
  • 1970-01-01
  • 2014-06-07
  • 2018-01-24
  • 2015-04-21
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多