2017-02-22 19 views
0

Q.どのように渡す必要がありますか?定数引数をPython基本クラスに渡しますか?Pythonは定数クラスを基底クラスに継承します

典型的な例を使用して、クラスCatDog(どちらもAnimalに由来)を持っています。 x.soundを呼び出すと、適切な単語("meow","woof")が返されます。

私の問題は、クラスのすべてのインスタンスが同じ音を出すので、私はsoundAnimalに渡すことができますしながら、ということである。これは、我々はすべてのインスタンスで"woof"を保存するので、無駄なようだと

class Animal: 
    def __init__(sound): 
     self.sound = sound 

class Dog: 
    def __init__(): 
     super().__init__("woof") 

私が持っています百万匹の犬と10億匹の猫。私の代わりに、メソッドを使用することもできます。

class Animal: 
    @staticmethod 
    def sound(): 
     raise NotImplementedError("Abstract") 

class Dog: 
    @staticmethod 
    def sound(): 
     return "woof" 

しかしを、今、私の動物はすべての非常に静かなので、これは簡単に見逃している他の誰かが一緒に来て、私の苦労し書かれた説明書を読まずにBirdクラスを書き込み、唯一発見したときメソッドが実際に呼び出されたときに青い月に一度メソッドを忘れてしまった。

私は理想的には、Animalクラス自体がパラメータを取るようなC++のテンプレートが好きです。すぐにエラーが発生することなく見落とすことができず、インスタンスごとにそれ以上のスペースを占めることはありません。

template<sound> 
class Animal() 
    . . . 

私はPythonで何をしていますか?

+0

私はすべての犬のインスタンスは、文字列のインターナショナルのために同じ実際の文字列オブジェクトを受け取る必要があると思います。 –

+0

私はあまりよく分かりませんが、これには '__slots__'が必要かもしれません。 – vks

+0

@PaulRooneyはまだすべてのオブジェクトのポインタを持っています。また、中身の文字列へのポインタは、64ビットシステムでは8バイトになります。これは "woof"文字列よりも長くなります。 –

答えて

0

工場設計パターンを試してみることができます。このような何か:

class AnimalFactory(object): 
    animals={} 

    @staticmethod 
    def registerAnimal(animalName, animalClass): 
     if not hasattr(animalClass, "sound"): 
      raise Exception("All animals need to make a sound") 
     AnimalFactory.animals[animalName]=animalClass 

    @staticmethod 
    def createNewAnimal(animalName): 
     return AnimalFactory.animals[animalName]() 

class Dog: 
    sound="woof" 

AnimalFactory.registerAnimal("dog", Dog) 

dog1=AnimalFactory.createNewAnimal("dog") 
print dog1.sound 

class Cat: 
    pass 

AnimalFactory.registerAnimal("cat", Cat) 

上記のコードは、次の出力を生成します。もちろん、

woof 
Traceback (most recent call last): 
    File "animals.py", line 25, in <module> 
    AnimalFactory.registerAnimal("cat", Cat) 
    File "animals.py", line 7, in registerAnimal 
    raise Exception("All animals need to make a sound") 

は、ユーザーがクラスを登録することを忘れかもしれませんが、限り、他のユーザーがAnimalFactoryを使用するように、新しい動物を作成しますこれは正常に動作するはずです。

関連する問題