154

Python では、すべてのサブクラスで共通の「定数」(実際には変数) をクラスに持たせたいと考えています。フレンドリーな構文でそれを行う方法はありますか? 今私は使用します:

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

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

それを行うためのより良い方法、または「動物」と書かずに行う方法があるかどうか疑問に思っています。サイズ前。Horse は Animal から継承します。

4

4 に答える 4

168

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。各動物クラスに異なるロジックが含まれている場合、これは特に役立ちます。

于 2012-05-20T10:46:20.147 に答える
25

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

いずれにせよ、どこで見つけるかを明示する必要がありますSIZES。別の方法としてSIZES、クラスを含むモジュールを配置することもできますが、その場合はすべてのクラスを 1 つのモジュールで定義する必要があります。

于 2012-05-20T09:53:44.847 に答える
15
class Animal:
    HUGE = "Huge"
    BIG = "Big"

class Horse:
    def printSize(self):
        print(Animal.HUGE)
于 2012-05-20T09:53:46.550 に答える
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
于 2012-05-21T07:28:00.573 に答える