[英]Difference between assigning values to attributes in child class and parent class
選擇A:
class Mammal(object):
def __init__(self, name):
self.name = name
def __str__(self):
return str(self.name)
class Human(Mammal):
def __init__(self, name):
self.name = name
me = Human("John")
print(me)
選擇B:
class Mammal(object):
def __init__(self, name):
self.name = name
def __str__(self):
return str(self.name)
class Human(Mammal):
def __init__(self, name):
super(Human, self).__init__(name)
me = Human("John")
print(me)
兩種選擇都會返回相同的結果,但有人可以解釋一下將名稱分配給子類(Human)和父類(Mammal)之間的區別嗎? 這兩個選擇之間有更好的選擇嗎?
非常感謝你!
這實際上是課堂設計和維護的問題。 顯然,在這種情況下,人類沒有哺乳動物沒有的特征,也沒有其他哺乳動物。 但是,比方說,讓我們說你以后更新Mammal有一個“腳”屬性:
class Mammal(object):
def __init__(self, name, feet):
self.name = name
self.feet = feet
哺乳動物現在有很多腳,所以你可能也會期待人類。 但me.feet
會拋出錯誤,因為Human __init__
沒有初始化它,而且Mammal __init__
沒有運行。 你也不能用我聲明腳me = Human('Joe', 2)
,因為人__init__
沒有接受那個論點。 所以你已經創造了一個維護問題 - 人類現在不是很好的哺乳動物,因為它們的一些承諾屬性總是未定義的。
使用super避免了這個問題:
class Human(Mammal):
def __init__(self, name):
super(Human, self).__init__(name, 2)
當然,如果你想要很多盜版者,這需要你繼承Human,但這是另一個問題。
相反的情況可能是你決定大多數哺乳動物都沒有名字。 顯然,在這種情況下,您只想在Human __init__
定義名稱。
在第一個示例中,您只說人類繼承自哺乳動物(Mammal上的.__init__
未被調用),如果您嘗試使用self.name
您將獲得屬性錯誤。
在第二個例子中,在Human
類中,您使用來自Mammal的self.name
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.