開發與維運

super() | Python從入門到精通:高階篇之三十一

方法的重寫override | Python從入門到精通:高階篇之三十

super()

我們仍然以Animal和Dog為例。

class Animal:
    def run(self):
        print('動物會跑~~~')

    def sleep(self):
        print('動物睡覺~~~')


class Dog(Animal):
    def bark(self):
        print('汪汪汪~~~') 

    def run(self):
        print('狗跑~~~~')    

現在我們在Animal中添加屬性。

    def __init__(self,name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter    
    def name(self,name):
        self._name = name

此時在Dog中創建對象

d = Dog() 

執行結果:

image.png

父類中的所有方法都會被子類繼承,包括特殊方法,也可以重寫特殊方法。此時先需要給Dog類添加屬性。
修改:

d = Dog('旺財') 
# d.name = '小黑'

print(d.name)  

執行結果:

image.png
image.png

重寫特殊方法,在Dog類中定義一個age屬性。

class Dog(Animal):

    def __init__(self,name,age):
        self._name = name
        self._age = age

    def bark(self):
        print('汪汪汪~~~') 

    def run(self):
        print('狗跑~~~~')   

    @property
    def age(self):
        return self._age

    @age.setter    
    def age(self,age):
        self._age = age      

d = Dog('旺財',18) 
d.name = '小黑'

print(d.name)       
print(d.age) 

執行結果:

image.png

name屬性已經在父類中定義,此時希望可以直接調用父類的__init__來初始化父類中定義的屬性。

    def __init__(self,name,age):
        Animal__init__(self,name)
        self._age = age

d = Dog('旺財',18) 
print(d.name)       
print(d.age) 

image.png

但是這個時候方法被寫死,只能調用父類(Animal)中的屬性。如果Dog類的父類更換,則需要修改的程序則會繁瑣。不建議使用,我們需要一個動態獲取父類的方法。

super() 可以用來獲取當前類的父類,並且通過super()返回對象調用父類方法時,不需要傳遞self。

super().__init__(name)

執行結果:

image.png

配套視頻課程,點擊這裡查看

獲取更多資源請訂閱Python學習站

Leave a Reply

Your email address will not be published. Required fields are marked *