繼承是面向對象程序設計的重要特徵,也是實現"代碼複用"的重要手段。
若是一個新類繼承自一個設計好的類,就直接具有已有類的特徵,這樣就大大下降了工做難度,由於不少事情父類已經作了,不須要再從新作一遍,減小重複勞動。已有的類,咱們稱爲父類
或者基類
,新的類,咱們稱爲子類
或者派生類
。 python
繼承關係示意圖:
git
繼承語法格式:github
class 子類類名[(父類1 [, 父類2, ...])] 類體結構
說明:markdown
在python中,全部類都繼承自類object
,也稱之爲根基類
。
當定義類的時候,只有類名,沒有繼承的相關參數時,則此時默認繼承類object
。 從另一個角度理解,全部的類繼承關係最上層都是類object
,類object
是全部類的父類,在object
類中定義了全部類的共有的默認實現,好比:__new__()
、__init__()
等很是常見的方法。ssh
def mro(self, *args, **kwargs): # real signature unknown """ Return a type's method resolution order. """ pass
返回type
方法的解析順序,也就對應着類的繼承關係。ide
class Person: pass class Student(Person): pass print("使用mro函數") print(Student.mro()) print("--" * 20) print("使用__mro__屬性") print(Student.__mro__)
運行結果:函數
使用mro函數 [<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>] ---------------------------------------- 使用__mro__屬性 (<class '__main__.Student'>, <class '__main__.Person'>, <class 'object'>)
代碼說明:spa
__mro__
屬性,兩個的運行結果是一致的,說明在底層,二者相同。其中一個屬於包裝修飾的功能。父類名.__init__(self [, 參數列表])
設計
子類對象名._父類名__私有屬性名
的方式進行調用。示例代碼:code
class Person: def __init__(self, name, age): self.name = name self.__age = age def say_age(self): print(self.name, "的年齡是:", self.__age, sep="") class Student(Person): def __init__(self, name, age, score): self.score = score # 手動調用父類的__init__方法 Person.__init__(self, name, age) print("使用繼承父類的公開的屬性和方法") s1 = Student("聶發俊", 100, 100) print("s1.name=", s1.name, sep='') s1.say_age() print("使用繼承父類私有的屬性和方法") print(dir(s1)) print(s1._Person__age) print(s1.age)
運行結果:
Traceback (most recent call last): File "test.py", line 27, in <module> print(s1.age) AttributeError: 'Student' object has no attribute 'age' 使用繼承父類的公開的屬性和方法 s1.name=張三 聶發俊的年齡是:100 使用繼承父類私有的屬性和方法 ['_Person__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_age', 'score'] 6
代碼說明:
__init__
方法,由於這個不是__new__
方法,是一個初始化方法,不是實際產生對象的方法,因此不會自動執行,須要手動調用。__age
的時候,報錯了,說明經過繼承,子類不能使用父類的私有屬性和私有方法。備註:
更多精彩博客,請訪問: 聶發俊的技術博客
對應視頻教程,請訪問: python400
完整markdown筆記,請訪問: python400_learn_github