孤荷淩寒自學python第二十一天初識python的類
孤荷淩寒自學python第二十一天初識python的類
(完整學習過程屏幕記錄視頻地址在文末,手寫筆記在文末)
類是面向對象的編程語言非常重要的概念。
編程語言的進化史中從順序編程到結構化編程,最後才進化出面向對象的編程語言。今天主流的非常流行的編程語言如java等都是優秀的面向對象的編程語言。當然我感覺python也不例外,雖然目前我對python還沒有深入了解。
類的概念是向現實世界借鑒了人們理解世界的常識而得出的:
人類認識世界都是分門別類進行的,比如,我們把整個所見的事物分為有生命的和無生命的兩類。
在有生命的事物中,我們又分為微生物、植物、動物三大類。動物中我們又有了更多的分類。
而每一個類別不管它是個大的類別,還是小的類別,我們怎麽區分開它們呢,那是因為每一類事物都有這一類事物的【特點】,這是我們識別每類事物的關鍵判斷 點。
在編程語言中,一類事物的特點,即稱為【類】的【屬性】。
類除了有屬性,每類事物還有它可以采取的行為,比如草履蟲這種類別的動物就已經有“遠離高鹽溶液”這樣的行為。
在編程語言中,一類事物可以執行的行為,即稱為【類】的【方法】。
我個人呢是完全獨自一人從零開始自學編程語言的,以上是自己對編程語言中【類】的基本理解,肯定不是很標準和精準,但可以基本描述出【類】的粗略特征。
我們已經知道了【類】的最重要的兩個組成——【屬性】與【方法】
定義一個類,最主要核心的就是要指明這個類的【屬性】和【方法】
一、類的定義格式
class 類名(基類列表) :
類的代碼塊
類名,即是給類一個名稱。
基類,又叫做父類。其實我認為理解為大類也可,其實就是我們生活中分類時更大的類。
舉例說,狗類是一個大的類別,而獅子狗是狗類這個大類中的一個小類
而獅子狗不僅有一般狗類的特征(屬性)也有自己這個小類別 的不同的特征
於是我們就說,獅子狗就來自於狗類這個基類的定義基礎上的變化。
就把【狗類】稱之為【獅子狗類】的【基類】也叫【父類】
基類列表,意味著一個類可能以多個不同上級類作為【基類】,同時具備多個【基類】的屬性特征。
二、類的屬性
類的屬性本質上是類內部代碼塊中定義的變量。
測試:
class 魔法水杯類(object): #object 是最基礎的總類,python中的所有類都繼承自object類
顏色=‘紅色‘
材質=‘魔法玻璃‘
透明度=‘半透明‘
容量=‘100毫升‘
#上面在類的內部代碼中定義的四個全局變量:顏色、材質、透明度、容量 就是【魔法水杯類】的四個屬性
要訪問【類】中的屬性,一般情況下需要將【類】實例化為具體的【對象】——
即是說,【魔法水杯類】還不是一個具體的東西,只是一類事物的總稱,我們需要一個具體的【魔法水杯】才能具體訪問其中的屬性。
實例化【類】為具體的【對象】的方法是:
具體對象=類名([可選的初始化參數列表])
然後我們就可以通過:
具體對象.屬性
這樣的形式來訪問到【具體對象】的【屬性】了。
測試:
class 魔法水杯類(object): #object 是最基礎的總類,python中的所有類都繼承自object類
顏色=‘紅色‘
材質=‘魔法玻璃‘
透明度=‘半透明‘
容量=‘100毫升‘
#上面在類的內部代碼中定義的四個全局變量:顏色、材質、透明度、容量 就是【魔法水杯類】的四個屬性
一只魔法水杯=魔法水杯類() #因為【魔法水杯類】沒有定義初始化的形式參數,所以這兒在【實例化】類時,沒有指定初始化實參。
print(一只魔法水杯.顏色) #現在可以通過 點 語法,在具體的對象 後訪問 類 實例化 後的 具體對象的屬性了。
print(一只魔法水杯.材質)
運行結果 :
紅色
魔法玻璃
三、類的方法
類的方法即是說一個類可以執行的操作或可以執行的運算或可以完成的任務等。
現在要為上面測試定義的【魔法水杯類】添加可以執行的 方法,以便魔法水杯能有真正的“魔法操作”。
類的方法的實質 是 【類】的內部代碼中定義的【函數】
一般情況下,我們仍然需要將【類】實例化為【具體對象】後才能通過點語法執行【具體對象】的方法。
測試:
class 魔法水杯類(object): #object 是最基礎的總類,python中的所有類都繼承自object類
顏色=‘紅色‘
材質=‘魔法玻璃‘
透明度=‘半透明‘
容量=‘100毫升‘
當前使用水杯的人=‘沒有‘ #這是類中定義的一個全局變量
#上面在類的內部代碼塊中定義的五個全局變量:顏色、材質、透明度、容量、當前使用水杯的人 就是【魔法水杯類】的五個屬性
def 告訴訪問者魔法水杯的創造者(self): #這兒在類的內部代碼塊中定義了一個【函數】,對於類的外部訪問者來說,這就是類的一個方法
#類的內部代碼塊中定義的每個函數都有一個默認的【形參】—— self ,在類的外部具體訪問類實例化後的對象的此方法時,卻不要傳遞【實參】給這個【形參】。
return ‘我的創造者是:孤荷淩寒‘
def 魔法水杯的容量最大值(self):
return self.容量 #在類的內部代碼塊中的函數中訪問類的屬性時,在屬性前面使用self表示類自身。
def 告訴魔法水杯並返回目前使用魔法水杯的人(self,當前使用水杯的人=‘沒有‘): #此方法函數除了默認形參self之外,添加了一個可選形參——【使用水杯的人】,用於此方法函數接收並返回屬性
#此函數的形式參數【當前使用水杯的人】也可以認為是當前函數 的一個局部變量,註意此局部變量名與類的全局變量名完全相同
if 當前使用水杯的人!=‘沒有‘:
strTemp=當前使用水杯的人 #此處的【當前使用水杯的人】,是函數的形式參數,也即是此函數的局部變量。
self.當前使用水杯的人=strTemp #此處的【self.當前使用水杯的人】才是當前 類的 全局函數 ,也就是類的一個屬性
return self.當前使用水杯的人
一只魔法水杯=魔法水杯類() #因為【魔法水杯類】沒有定義初始化的形式參數,所以這兒在【實例化】類時,沒有指定初始化實參。
#print(一只魔法水杯.顏色) #現在可以通過 點 語法,在具體的對象 後訪問 類 實例化 後的 具體對象的屬性了。
#print(一只魔法水杯.材質)
str創造者=一只魔法水杯.告訴訪問者魔法水杯的創造者() #這個類的這個方法函數不需要傳遞任何實參,因為此方法函數實際上除了self形參外沒有定義其它形參。
str水杯的容量=一只魔法水杯.魔法水杯的容量最大值()
#下面第一次訪問【一只魔法水杯】對象的【方法】:【告訴魔法水杯並返回目前使用魔法水杯的人】,要傳遞實參給此方法函數的形式參數——【當前使用水杯的人】
str水杯當前擁有者=一只魔法水杯.告訴魔法水杯並返回目前使用魔法水杯的人(‘張三‘)
print(‘str創造者=‘,str創造者)
print(‘str水杯的容量=‘,str水杯的容量)
print(‘str水杯當前擁有者=‘,str水杯當前擁有者)
#下面第二次訪問【一只魔法水杯】對象的【方法】:【告訴魔法水杯並返回目前使用魔法水杯的人】,這一次不再傳遞實參給形式參數。
str第二次訪問當前水杯擁有者=一只魔法水杯.告訴魔法水杯並返回目前使用魔法水杯的人()
print(‘str第二次訪問當前水杯擁有者=‘,str第二次訪問當前水杯擁有者)
運行結果:
str創造者= 我的創造者是:孤荷淩寒
str水杯的容量= 100毫升
str水杯當前擁有者= 張三
str第二次訪問當前水杯擁有者= 張三
四、為類指定初始化方法
類的初始化方法,即是在【實例化】一個【類】時可以定義讓【類】完成哪些操作的方法。
類內部的初始化方法函數的函數 名稱 是固定的使用
__init__
這個名稱。
在正常情況下__init__這個方法,在類實例化後,是不能通過【具體對象】加點語法直接調用的。
而是在【實例化】類時,映射為調用此初始化方法。
測試:
class 魔法水杯類(object):
顏色=‘紅色‘ #這是魔法水杯類的默認顏色
材質=‘魔法玻璃‘
透明度=‘半透明‘
容量=‘100毫升‘ #這是魔法水杯類的默認容量
當前使用水杯的人=‘沒有‘ #這是魔法水杯類的默認使用者
#下面定義【類】的初始化方法函數
def __init__(self,指定水杯顏色,指定水杯容量,當前使用水杯的人=‘沒有‘):
#此初始化方法函數,除了默認的self形參外,定義了三個形參,其中最後一個形參是可選形參。
self.顏色=指定水杯顏色
self.容量=指定水杯容量
if 當前使用水杯的人!=‘沒有‘:
self.當前使用水杯的人=當前使用水杯的人
def 告訴訪問者魔法水杯的創造者(self):
return ‘我的創造者是:孤荷淩寒‘
def 魔法水杯的容量最大值(self):
return self.容量
def 告訴魔法水杯並返回目前使用魔法水杯的人(self,當前使用水杯的人=‘沒有‘):
if 當前使用水杯的人!=‘沒有‘:
self.當前使用水杯的人=當前使用水杯的人
return self.當前使用水杯的人
一只魔法水杯=魔法水杯類(‘藍色‘,‘300毫升‘,‘李四‘) #因為【魔法水杯類】有定義了三個初始化的形式參數,所以這兒在【實例化】類時,要傳遞初始化實參。
print(‘一只魔法水杯.顏色=‘,一只魔法水杯.顏色)
print(‘一只魔法水杯.材質=‘,一只魔法水杯.材質)
str創造者=一只魔法水杯.告訴訪問者魔法水杯的創造者()
str水杯的容量=一只魔法水杯.魔法水杯的容量最大值()
print(‘str創造者=‘,str創造者)
print(‘str水杯的容量=‘,str水杯的容量)
str水杯當前擁有者=一只魔法水杯.告訴魔法水杯並返回目前使用魔法水杯的人()
print(‘str水杯當前擁有者=‘,str水杯當前擁有者)
str水杯當前擁有者=一只魔法水杯.告訴魔法水杯並返回目前使用魔法水杯的人(‘張三‘)
#這兒傳遞了實參,意味著 杯子 的使用者 有改變!!
print(‘str水杯當前擁有者=‘,str水杯當前擁有者)
運行結果 :
一只魔法水杯.顏色= 藍色
一只魔法水杯.材質= 魔法玻璃
str創造者= 我的創造者是:孤荷淩寒
str水杯的容量= 300毫升
str水杯當前擁有者= 李四
str水杯當前擁有者= 張三 #杯子 的使用者 有改變!!
類的初始化方法函數 可以不定義,如果沒有定義類的初始化方法函數,則
類默認調用一個python默認無任何形參的初始化方法函數。
如果 在類的內部代碼塊中定義了多個初始化方法函數 ,那麽按定義的先後順序,後定義的初始化方法函數將取代先定義的初始化方法函數。
五、類的公開屬性、公開方法與私有屬性、私有方法
類的公開屬性、公開方法是指將類實例化為具體對象後,訪問對象時,可以直接通過點語法訪問這些屬性和方法。
類的私有屬性、私有方法是指將類實例化為具體對象後,訪問對象時,一般情況下無法直接通過點語法訪問這些屬性和方法。
在類內部代碼塊中區分公開屬性、公開方法與私有屬性、私有方法的具體代碼寫法是:
如果類中的一個屬性或方法命名時以__兩根英文半角下劃線開頭,那麽這個屬性或方法就是類的私有屬性和方法。其它的命名方式命名的則是公開屬性和方法。
測試:
class 魔法水杯類(object):
顏色=‘紅色‘ #這是魔法水杯類的默認顏色
材質=‘魔法玻璃‘
透明度=‘半透明‘
__容量=‘100毫升‘ #此屬性已經變成類的私有屬性了。
__當前使用水杯的人=‘沒有‘ #此屬性已經變成類的私有屬性了。
#下面定義【類】的初始化方法函數
def __init__(self,指定水杯顏色,指定水杯容量,當前使用水杯的人=‘沒有‘):
#此初始化方法函數,除了默認的self形參外,定義了三個形參,其中最後一個形參是可選形參。
self.顏色=指定水杯顏色
self.__容量=指定水杯容量
if 當前使用水杯的人!=‘沒有‘:
self.__當前使用水杯的人=當前使用水杯的人
def 告訴訪問者魔法水杯的創造者(self):
return ‘我的創造者是:孤荷淩寒‘
def 魔法水杯的容量最大值(self):
return self.__容量
def 告訴魔法水杯並返回目前使用魔法水杯的人(self,當前使用水杯的人=‘沒有‘):
if 當前使用水杯的人!=‘沒有‘:
self.__當前使用水杯的人=當前使用水杯的人
return self.__當前使用水杯的人
一只魔法水杯=魔法水杯類(‘藍色‘,‘300毫升‘,‘李四‘) #因為【魔法水杯類】有定義了三個初始化的形式參數,所以這兒在【實例化】類時,要傳遞初始化實參。
print(‘一只魔法水杯.顏色=‘,一只魔法水杯.顏色)
print(‘一只魔法水杯.__容量=‘,一只魔法水杯.__容量) #這句代碼將執行報出錯誤,因為我們不能訪問類中的私有屬性【_容量】
str創造者=一只魔法水杯.告訴訪問者魔法水杯的創造者()
str水杯的容量=一只魔法水杯.魔法水杯的容量最大值()
print(‘str創造者=‘,str創造者)
print(‘str水杯的容量=‘,str水杯的容量)
str水杯當前擁有者=一只魔法水杯.告訴魔法水杯並返回目前使用魔法水杯的人()
print(‘str水杯當前擁有者=‘,str水杯當前擁有者)
運行結果:
一只魔法水杯.顏色= 藍色
Traceback (most recent call last):
File "c:\Users\pw\Desktop\新建文本文檔.py", line 28, in <module>
print(‘一只魔法水杯.__容量=‘,一只魔法水杯.__容量) #這句代碼將執行報出錯誤,因為我們不能訪問類中的私有屬性【_容量】
AttributeError: ‘魔法水杯類‘ object has no attribute ‘__容量‘
str創造者= 我的創造者是:孤荷淩寒
str水杯的容量= 300毫升
str水杯當前擁有者= 李四
——————————
今天整理的學習筆記完成,最後例行說明下我的自學思路:
根據過去多年我自學各種編程語言的經歷,認為只有真正體驗式,解決實際問題式的學習才會有真正的效果,即讓學習實際發生。在2004年的時候我開始在一個鄉村小學自學電腦 並學習vb6編程語言,沒有學習同伴,也沒有高師在上,甚至電腦都是孤島(鄉村那時還沒有網絡),有的只是一本舊書,在痛苦的自學摸索中,我找到適應自己零基礎的學習方法:首先是每讀書的一小節就作相應的手寫筆記,第二步就是上機測試每一個筆記內容是否實現,其中會發現書中講的其實有出入或錯誤,第三步就是在上機測試之後,將筆記改為電子版,形成最終的修訂好的正確無誤的學習筆記 。
通過反復嘗試錯誤,在那個沒有分享與交流的黑暗時期我摸黑學會了VB6,爾後接觸了其它語言,也曾聽過付費視頻課程,結果發現也許自己學歷果然太低,就算是零基礎的入門課程,其實也難以跟上進度,講師的教學多數出現對初學者的實際情況並不了解的情況,況且學習者的個體也存在差異呢?當然更可怕的是收費課程的價格往往是自己難以承受的。
於是我的所有編程學習都改為了自學,繼續自己的三步學習筆記法的學習之路。
當然自學的最大問題是會走那麽多的彎路,沒有導師直接輸入式的教學來得直接,好在網絡給我們帶來無限搜索的機會,大家在網絡上的學習日誌帶給我們共享交流的機會,而QQ群等交流平臺、網絡社區的成立,我們可以一起自學,互相批評交流,也可以獲得更有效,更自主的自學成果。
於是我以人生已過半的年齡,決定繼續我的編程自學之路,開始學習python,只希望與大家共同交流,一個人的獨行是可怕的,只有一群人的共同前進才是有希望的。
誠摯期待您的交流分享批評指點!歡迎聯系我加入從零開始的自學聯盟。
這個時代互聯網成為了一種基礎設施的存在,於是本來在孤獨學習之路上的我們變得不再孤獨,因為網絡就是一個新的客廳,我們時刻都可以進行沙龍活動。
非常樂意能與大家一起交流自己自學心得和發現,更希望大家能夠對我學習過程中的錯誤給予指點——是的,這樣我就能有許多免費的高師了——這也是分享時代,社區時代帶來的好福利,我相信大家會的,是吧!
根據完全共享的精神,開源互助的理念,我的個人自學錄制過程是全部按4K高清視頻錄制的,從手寫筆記到驗證手寫筆記的上機操作過程全程錄制,但因為4K高清文件太大均超過5G以上,所以無法上傳至網絡,如有需要可聯系我QQ578652607對傳,樂意分享。上傳分享到百度網盤的只是壓縮後的720P的視頻。
我的學習過程錄像百度盤地址分享如下:(清晰度:1280x720)
鏈接:https://pan.baidu.com/s/1wb2T19GdHnEboTH7jCyKBA 密碼:lyw5
Bilibili:
https://www.bilibili.com/video/av36210897/
喜馬拉雅語音筆記:
https://www.ximalaya.com/keji/19103006/140278184
孤荷淩寒自學python第二十一天初識python的類