孤荷淩寒自學python第二十二天python類的繼承
孤荷淩寒自學python第二十二天python類的繼承
(完整學習過程屏幕記錄視頻地址在文末,手寫筆記在文末)
python中定義的類可以繼承自其它類,所謂繼承的概念,我的理解 是,就是一個類B繼承自類A,意味著類B的內部代碼塊中就算不寫任何代碼,類B仍然擁有類A的所有公開的屬性和方法。
這個優勢非常方便於我們在要創建一個在原有類的基礎上只是稍微有所變化 的類時,可以只通過繼承一個類之後,再作屬性和方法增改即可完成,大大的減輕了代碼工作量。
在類的繼承活動中,被繼承的類稱之為【基類】也叫【父類】
而繼承【基類】而得到的新的類,叫【子類】
一、單一繼承
一個【子類】只從一個【基類】繼承而來。
測試:
class cup(object): #作為基類
__private=‘我是cup類的私有屬性‘
public=‘我是cup類的公開屬性‘
one=‘我是cup類的第一屬性‘
__two=‘我是cup類的第二屬性‘
def __init__(self,one,two):
self.one=one
self.two=two
def publicmethod(self,var1,var2):
return "cup類的公開方法收到的參數是:" + var1 + "," + var2 + ‘,私用屬性__two=‘ + self.__two
def __privatemethod(self):
print(‘這是cup類中的私有方法打印的內容。‘)
newcupone=cup(‘陶瓷‘,‘白色‘)
str1=newcupone.publicmethod(‘內容一‘,‘內容二‘)
class bluecup(cup): #繼承自cup類的子類
pass #當前 子類 內部代碼 什麽也沒有定義。
newbluecupone=bluecup(‘玻璃‘,‘藍色‘)
str2=newbluecupone.publicmethod(‘子類的內容一‘,‘子類的內容二‘)
print(str1)
print(str2)
運行結果:
cup類的公開方法收到的參數是:內容一,內容二,私用屬性__two=我是cup類的第二屬性
cup類的公開方法收到的參數是:子類的內容一,子類的內容二,私用屬性__two=我是cup類的第二屬性
從運行結果中註意到,基類cup的實例化對象newcupone執行方法:publicmethod
和
子類bluecup的實例化對象newbluecupone執行方法:publicmethod
得到的結果實質上並沒有什麽不同。
這是因為子類bluecup沒有定義自己的publicmethod方法,因此 只是完全照搬cup類的這個方法而已。
子類並沒有繼承基類的私有方法與屬性。
測試如下:
class cup(object): #作為基類
__private=‘我是cup類的私有屬性‘
public=‘我是cup類的公開屬性‘
one=‘我是cup類的第一屬性‘
__two=‘我是cup類的第二屬性‘
def __init__(self,one,two):
self.one=one
self.two=two
def publicmethod(self,var1,var2):
return "cup類的公開方法收到的參數是:" + var1 + "," + var2 + ‘,私用屬性__two=‘ + self.__two
def __privatemethod(self):
return ‘這是cup類中的私有方法打印的內容。‘
newcupone=cup(‘陶瓷‘,‘白色‘)
str1=newcupone.publicmethod(‘內容一‘,‘內容二‘)
class bluecup(cup): #繼承自cup類的子類
bluecupnewshuxing=cup.__privatemethod() #這兒嘗試調用基類的私用方法__privatemethod,註意調用方法是:基類名.基類方法()
#執行上一語句會出錯。因為子類並沒有繼承基類的私有方法
newbluecupone=bluecup(‘玻璃‘,‘藍色‘)
str2=newbluecupone.publicmethod(‘子類的內容一‘,‘子類的內容二‘)
print(str1)
print(str2)
運行結果:
Traceback (most recent call last):
File "c:\Users\pw\Desktop\新建文本文檔.py", line 19, in <module>
class bluecup(cup): #繼承自cup類的子類
File "c:\Users\pw\Desktop\新建文本文檔.py", line 20, in bluecup
bluecupnewshuxing=cup.__privatemethod() #這兒嘗試調用基類的私用方法__privatemethod,註意調用方法是:基類名.基類方法()
AttributeError: type object ‘cup‘ has no attribute ‘_bluecup__privatemethod‘
當然子類中可以調用基類的公用方法,調用方法仍然是;
基類名.基類方法()
二、多重繼承
一個類也可以從多個基類中繼承屬性和方法,稱之為多重繼承,只需要在定義類的基類列表中輸入多個基類名稱即可。
class cup(object): #作為基類
__private=‘我是cup類的私有屬性‘
public=‘我是cup類的公開屬性‘
one=‘我是cup類的第一屬性‘
__two=‘我是cup類的第二屬性‘
def __init__(self,one,two):
self.one=one
self.two=two
def publicmethod(self,var1,var2):
return "cup類的公開方法收到的參數是:" + var1 + "," + var2 + ‘,私用屬性__two=‘ + self.__two
def __privatemethod(self):
return ‘這是cup類中的私有方法打印的內容。‘
def 倒掉水(self):
return ‘這是cup類執行了【倒掉水】的方法。‘
class glass(object): #作為基類
__private=‘我是glass類的私有屬性‘
public=‘我是glass類的公開屬性‘
one=‘我是glass類的第一屬性‘
__two=‘我是glass類的第二屬性‘
three=‘我是glass類的第三屬性‘
def __init__(self,one,two,three):
self.one=one
self.two=two
self.three=three
def publicmethod(self,var1,var2):
return "glass類的公開方法收到的參數是:" + var1 + "," + var2 + ‘,私用屬性__two=‘ + self.__two
def __privatemethod(self):
return ‘這是glass類中的私有方法打印的內容。‘
def 碎掉(self):
return(‘glass類的實體化對象執行此方法後,碎掉了。‘)
class cupglass(cup,glass): #繼承自cup類和glass類而實現雙重繼承的子類
pass
newobj=cupglass(‘玻璃‘,‘藍色‘) #因為定義cupglass類時,基類列表是有順序的,基類cup在列表最前面,優先級最高,因此以它的初始化方法函數 的參數個數為準
newobj2=cupglass(‘陶瓷‘,‘白色‘)
str1=newobj.publicmethod(‘子類的內容一‘,‘子類的內容二‘)
str2=newobj2.publicmethod(‘子類二的內容一‘,‘子類二的內容二‘)
print(str1)
print(str2)
運行結果:
cup類的公開方法收到的參數是:子類的內容一,子類的內容二,私用屬性__two=我是cup類的第二屬性
cup類的公開方法收到的參數是:子類二的內容一,子類二的內容二,私用屬性__two=我是cup類的第二屬性
從運行結果從可以看出,cupglass類繼承兩個基類中同名的公開方法publicmethod時,發現永遠都只執行了cup基類的publicmethod方法,這是為什麽呢?
原來定義cupglass類時,基類列表是有順序的,基類cup在列表最前面,優先級最高,所以當多個基類中出現重名的對象時,默認繼承優先級高的基類的對象。
——————————
今天整理的學習筆記完成,最後例行說明下我的自學思路:
根據過去多年我自學各種編程語言的經歷,認為只有真正體驗式,解決實際問題式的學習才會有真正的效果,即讓學習實際發生。在2004年的時候我開始在一個鄉村小學自學電腦 並學習vb6編程語言,沒有學習同伴,也沒有高師在上,甚至電腦都是孤島(鄉村那時還沒有網絡),有的只是一本舊書,在痛苦的自學摸索中,我找到適應自己零基礎的學習方法:首先是每讀書的一小節就作相應的手寫筆記,第二步就是上機測試每一個筆記內容是否實現,其中會發現書中講的其實有出入或錯誤,第三步就是在上機測試之後,將筆記改為電子版,形成最終的修訂好的正確無誤的學習筆記 。
通過反復嘗試錯誤,在那個沒有分享與交流的黑暗時期我摸黑學會了VB6,爾後接觸了其它語言,也曾聽過付費視頻課程,結果發現也許自己學歷果然太低,就算是零基礎的入門課程,其實也難以跟上進度,講師的教學多數出現對初學者的實際情況並不了解的情況,況且學習者的個體也存在差異呢?當然更可怕的是收費課程的價格往往是自己難以承受的。
於是我的所有編程學習都改為了自學,繼續自己的三步學習筆記法的學習之路。
當然自學的最大問題是會走那麽多的彎路,沒有導師直接輸入式的教學來得直接,好在網絡給我們帶來無限搜索的機會,大家在網絡上的學習日誌帶給我們共享交流的機會,而QQ群等交流平臺、網絡社區的成立,我們可以一起自學,互相批評交流,也可以獲得更有效,更自主的自學成果。
於是我以人生已過半的年齡,決定繼續我的編程自學之路,開始學習python,只希望與大家共同交流,一個人的獨行是可怕的,只有一群人的共同前進才是有希望的。
誠摯期待您的交流分享批評指點!歡迎聯系我加入從零開始的自學聯盟。
這個時代互聯網成為了一種基礎設施的存在,於是本來在孤獨學習之路上的我們變得不再孤獨,因為網絡就是一個新的客廳,我們時刻都可以進行沙龍活動。
非常樂意能與大家一起交流自己自學心得和發現,更希望大家能夠對我學習過程中的錯誤給予指點——是的,這樣我就能有許多免費的高師了——這也是分享時代,社區時代帶來的好福利,我相信大家會的,是吧!
根據完全共享的精神,開源互助的理念,我的個人自學錄制過程是全部按4K高清視頻錄制的,從手寫筆記到驗證手寫筆記的上機操作過程全程錄制,但因為4K高清文件太大均超過5G以上,所以無法上傳至網絡,如有需要可聯系我QQ578652607對傳,樂意分享。上傳分享到百度網盤的只是壓縮後的720P的視頻。
我的學習過程錄像百度盤地址分享如下:(清晰度:1280x720)
鏈接:https://pan.baidu.com/s/17kG7YiFYV20s7j6ML88mZw 密碼:mpag
Bilibili:
https://www.bilibili.com/video/av36211003/
喜馬拉雅語音筆記:
https://www.ximalaya.com/keji/19103006/140522246
孤荷淩寒自學python第二十二天python類的繼承