簡體   English   中英

為子類和父類中的屬性賦值的區別

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM