我想知道如何创建一个跳过或不包含父类使用的属性的子类__init__
和super()
但我似乎无法包装我的头在附近。在Python中重写超类时跳过一个参数
我试图用以下代码创建一个简单继承:
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)
下面,我试图打印为每个子类(Dog
和Lion
)的基本属性/信息。它们的共同参数为name
,age
和sound
这些都是出现在我的Dog
类(我还加pet
和breed
)。
对于Lion
类,因为它不需要任何名称(因为它通常生活在野外)我试图跳过name
参数,所以我不包括在__init__
和super()
。
当我运行该文件,它得到一个
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)
所以我试图解决该代码,并在Animal
类设置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
正确的属性,除了其不需要名字。
有什么我在代码中丢失?
继承是一个**是一个**的关系。如果你不希望所有'动物'有'名字',不要给他们一个'名字'。 –