2017-09-02 2 views
2

親クラスが持つ属性をスキップするか、含まないサブクラスを作成する方法を理解しようとしていますが、__init__とはラップできないようです私の頭の周り。Pythonでスーパークラスをオーバーライドするときのパラメータをスキップする

Iは、以下のコードを有する単純な継承作成しようとした:以下

class Animal: 
    def __init__(self, name, age, sound, **kwargs): 
     self.name = name 
     self.age = age 
     self.sound = sound 


     for key, value in kwargs.items(): 
      setattr(self, key, value) 

class Dog(Animal): 
    def __init__(self, name, age, sound, *args, **kwargs): 
     super().__init__(name, age, sound, **kwargs) 


class Lion(Animal): 
    def __init__(self, age, sound, *args, **kwargs): 
     super().__init__(age, sound, **kwargs) 

を、Iは各サブクラス(DogLion)のための基本的な属性/情報を印刷しようとしました。それらの一般的なパラメータは、,ageおよびsoundであり、これらはすべてDogクラス(私もpetおよびbreedを追加しました)に存在します。 (それは通常、野生に住んでいるので)それは私が私が__init__super()でそれを含んでいませんでしたので、nameパラメータをスキップしようとした任意の名前を必要としないので、Lionクラスについては

私はそれは私がコードを回避し、Animalクラスにsound=""を設定しようとしました

TypeError: __init__() missing 1 required positional argument: 'sound'.

dog = Dog('Lucky', 6, 'Arf! Arf!', pet=True, breed='Shih Tzu') 
lion = Lion(10, 'Roar!', wild=True) 
print("===Dog===") 
print("Name: {}".format(dog.name)) 
print("Age: {}".format(dog.age)) 
print(dog.sound) 

print("\n===Lion===")  
print("Age: {}".format(lion.age)) 
print(lion.sound) 

を取得したファイルを実行します。

class Animal: 
    def __init__(self, name, age, sound="", **kwargs): # <--I added quotes 

今回はエラーは発生しませんでしたが、正しい出力が得られませんでした。

===Dog=== 
Name: Lucky 
Age: 6 
Arf! Arf! 

===Lion=== 
Age: Roar! 

私はLionが必要とされていない名前を除いてDogのような適切な場所で右の属性を持っていると思います。

コードに記載されていないことはありますか?

+1

継承がある** **の関係は常にクラスは抽象的な「本当の概念」にしようとすることを覚えておいてください。すべての 'Animal'sに' name'を持たせたくない場合は、 'name'を与えないでください。 –

答えて

1

単純な修正は、空のnameを渡すだけです。 ""またはNone。あなたがそれらを必須にした場合、あなたは単に引数をスキップすることはできないからです! Animal__init__のようにAnimalは名前を持っているかもしれないが、名前を必要としないため

class Lion(Animal): 
    def __init__(self, age, sound, *args, **kwargs): 
     super().__init__("", age, sound, **kwargs) 

しかし多分より良い修正がnameオプションのパラメータを作ることであろう。両方のアプローチは(私の知る限り)正しい結果が得られ

class Animal: 
    def __init__(self, age, sound, **kwargs): 
     self.age = age 
     self.sound = sound 
     for key, value in kwargs.items(): 
      setattr(self, key, value) 

class Dog(Animal): 
    def __init__(self, age, sound, *args, **kwargs): 
     super().__init__(age, sound, **kwargs) 


class Lion(Animal): 
    def __init__(self, age, sound, *args, **kwargs): 
     super().__init__(age, sound, **kwargs) 

dog = Dog(6, 'Arf! Arf!', name='Lucky', pet=True, breed='Shih Tzu') 
lion = Lion(10, 'Roar!', wild=True) 
print("===Dog===") 
print("Name: {}".format(dog.name)) 
print("Age: {}".format(dog.age)) 
print(dog.sound) 

print("\n===Lion===")  
print("Age: {}".format(lion.age)) 
print(lion.sound) 

===Dog=== 
Name: Lucky 
Age: 6 
Arf! Arf! 

===Lion=== 
Age: 10 
Roar! 
関連する問題