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

あなたは本当にここの列挙型の後にいるようです
エリック

回答:


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"]このタイプの定数を使用します。
Lova Chittumuri

17

(インスタンスメソッド内)または(クラスメソッド内)を使用SIZESしてアクセスできます。self.SIZEScls.SIZES

いずれの場合も、どこにあるかを明示する必要がありますSIZES。代わりの方法はSIZES、クラスを含むモジュールを配置することですが、その後、すべてのクラスを単一のモジュールで定義する必要があります。


馬は確かに動物のサブクラスです。実際、Animal.SIZES [1]の代わりにself.SIZES [1]を使用することは完全に可能です。
betabandido 2012年

@betabandido:OPが質問を修正しました。それに応じて回答を更新します。
Fred Foo

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'ですか?
十字軍
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.