親クラスが持つ属性をスキップするか、含まないサブクラスを作成する方法を理解しようとしていますが、__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は各サブクラス(Dog
とLion
)のための基本的な属性/情報を印刷しようとしました。それらの一般的なパラメータは、,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
のような適切な場所で右の属性を持っていると思います。
コードに記載されていないことはありますか?
継承がある** **の関係は常にクラスは抽象的な「本当の概念」にしようとすることを覚えておいてください。すべての 'Animal'sに' name'を持たせたくない場合は、 'name'を与えないでください。 –