property裝飾器 | Python從入門到精通:高階篇之二十八
繼承
定義一個類 Animal(動物),這個類中需要兩個方法:run()、 sleep() 。
class Animal:
def run(self):
print('動物會跑~~~')
def sleep(self):
print('動物睡覺~~~')
a = Animal()
a.run()
執行結果:
現在還想定義一個類,Dog(狗),這個類中需要三個方法:run()、 sleep() 、bark()。
有一個類,能夠實現我們需要的大部分功能,但是不能實現全部功能。
如何能讓這個類來實現全部的功能呢?
① 直接修改這個類,在這個類中添加我們需要的功能
class Animal:
def run(self):
print('動物會跑~~~')
def sleep(self):
print('動物睡覺~~~')
def bark(self):
print('動物嚎叫~~~')
這種方式修改起來會比較麻煩,並且會違反OCP原則。(開閉原則),我們不推薦使用這種方式。
② 直接創建一個新的類
class Dog:
def run(self):
print('狗會跑~~~')
def sleep(self):
print('狗睡覺~~~')
def bark(self):
print('汪汪汪~~~')
創建一個新的類比較麻煩,並且需要大量的進行復制粘貼,會出現大量的重複性代碼。這種方式也不太適合。
③ 直接從Animal類中來繼承它的屬性和方法
- 繼承是面向對象三大特性之一
- 通過繼承我們可以使一個類獲取到其他類中的屬性和方法
- 在定義類時,可以在類名後的括號中指定當前類的父類(超類、基類、super),子類(衍生類)可以直接繼承父類中的所有的屬性和方法
class Dog(Animal):
def bark(self):
print('汪汪汪~~~')
d = Dog()
d.run()
d.sleep()
d.bark()
執行結果:
繼承的優勢:
通過繼承可以直接讓子類獲取到父類的方法或屬性,避免編寫重複性的代碼,並且也符合OCP原則,所以我們經常需要通過繼承來對一個類進行擴展。
檢查一個對象是否是另外一個的實例
r = isinstance(d , Dog)
#r = isinstance(d , Animal)
print(r)
執行結果:
定義一個哈士奇類:
class Hashiqi(Dog):
def fan_sha(self):
print('我是一隻傻傻的哈士奇')
d = Dog()
h = Hashiqi()
哈士奇類可以繼dog類。
在創建類時,如果省略了父類,則默認父類為object,object是所有類的父類,所有類都繼承自object。
class Person(object):
pass
issubclass() 檢查一個類是否是另一個類的子類
#print(issubclass(Dog, Animal ))
#print(issubclass(Animal , Dog))
#print(issubclass(Animal , object))
print(issubclass(Person , object))
執行結果:
isinstance()用來檢查一個對象是否是一個類的實例。
- 如果這個類是這個對象的父類,也會返回True
- 所有的對象都是object的實例
#print(isinstance(d , object))
#print(isinstance(h , object))
print(isinstance(print , object))
執行結果:
繼承的確減少了我們的代碼量,但現在有另外問題:
class Dog(Animal):
def bark(self):
print('汪汪汪~~~')
def run(self):
print('狗跑~~~~')
class Hashiqi(Dog):
def fan_sha(self):
print('我是一隻傻傻的哈士奇')
d = Dog()
h = Hashiqi()
d.run()
現在子類父類都有run方法,那麼結果會是執行哪個呢?我們下一節來看。
配套視頻課程,點擊這裡查看
獲取更多資源請訂閱Python學習站