Python基礎(chǔ)學(xué)習(xí)之類與實(shí)例基本用法與注意事項(xiàng)詳解
本文實(shí)例講述了Python基礎(chǔ)學(xué)習(xí)之類與實(shí)例基本用法與注意事項(xiàng)。分享給大家供大家參考,具體如下:
前言
和其他編程語言相比,Python用非常少的新語法和語義將類加入到語言中。Python的類提供了面向?qū)ο缶幊痰乃袠?biāo)準(zhǔn)特性:類繼承機(jī)制允許多個基類,派生類可以覆蓋它基類的任何方法,一個方法可以調(diào)用基類中相同名稱的的方法。對象可以包含任意數(shù)量和類型的數(shù)據(jù)。和模塊一樣,類也擁有Python天然的動態(tài)特性:它們在運(yùn)行時創(chuàng)建,可以在創(chuàng)建后修改。
Python的類
Python類實(shí)例時,先調(diào)用__new__方法,返回該類的實(shí)例對象,這個實(shí)例對象就是__init__方法的第一個參數(shù)self,即self是__new__的返回值
(1)類的訪問控制:
①默認(rèn):Python中的成員函數(shù)和成員變量都是公開的(public),在python中沒有類似public,private等關(guān)鍵詞來修飾成員函數(shù)和成員變量。
②私有:在python中定義私有變量只需要在變量名或函數(shù)名前加上”__“兩個下劃線,那么這個函數(shù)或變量就是私有的了
原理:在內(nèi)部,python使用一種name mangling技術(shù),將__membername替換成_classname__membername,也就是說,類的內(nèi)部定義中,所有以雙下劃線開始的名字都被"翻譯"成前面加上單下劃線和類名的形式。
例如:為了保證不能在class之外訪問私有變量,Python會在類的內(nèi)部自動的把我們定義的__spam私有變量的名字替換成為_classname__spam(注意,classname前面是一個下劃線,spam前是兩個下劃線),因此,用戶在外部訪問__spam的時候就會提示找不到相應(yīng)的變量。
注:python中的私有變量和私有方法仍然是可以訪問的;訪問方法如下:
私有變量:實(shí)例._類名__變量名
私有方法:實(shí)例._類名__方法名()
(2)Python類和類成員的私有化支持:
其實(shí),Python并沒有真正的私有化支持,但可用下劃線得到偽私有。所以一般需要統(tǒng)一規(guī)范:
① _xxx:"單下劃線" 開始的成員變量叫做保護(hù)變量(protected),意思是只有類實(shí)例和子類實(shí)例能訪問到這些變量,
需通過類提供的接口進(jìn)行訪問;不能用'from <module> import *
'導(dǎo)入;
② __xxx:類中的私有變量/方法名(Python的函數(shù)也是對象,所以成員方法稱為成員變量也行得通),
" 雙下劃線 "開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數(shù)據(jù);
③ __xxx__系統(tǒng)定義名字,前后均有一個“雙下劃線”代表python里特殊方法專用的標(biāo)識,如__init__()代表類的構(gòu)造函數(shù);
注:python派生類可以與父類同名,因此這種情況可以使用私有變量:
class A(): def __init__(self): self.__name='python' #翻譯成self._A__name='python' class B(A): def func(self): print self.__name #翻譯成print self._B__name instance=B() #instance.func()#報錯:AttributeError: B instance has no attribute '_B__name' print instance.__dict__ print instance._A__name
輸出結(jié)果:
{'_A__name': 'python'}
python
注:當(dāng)B類取名A時,則instance.func()可以直接調(diào)用
(3)Python類的繼承:
python類和其他OOP語言一樣,都可以使用繼承功能,也同樣不允許多繼承,但可以通過多級繼承來實(shí)現(xiàn)。
(1)繼承方法:派生類的類名的()里面寫入父類的類名;
(2)構(gòu)造函數(shù):子類中構(gòu)造函數(shù)加上super(子類,self).__init__(參數(shù)1,參數(shù)2,….);
(3)實(shí)例化順序:實(shí)例化對象c---->c調(diào)用子類__init__()---->子類__init__()繼承父類__init__()----->調(diào)用父類__init__();
(4)判斷繼承的函數(shù):isinstance()及issubclass(),其中isinstance()用于檢查實(shí)例類型;issubclass()用于檢查類繼承;
(5)方法重寫:子類中定義與父類同名的方法,子類實(shí)例調(diào)用時就會使用重寫的方法;
(6)子類重寫構(gòu)造函數(shù):子類構(gòu)造函數(shù)中不使用super調(diào)用父類即可;
(7)多態(tài):當(dāng)子類和父類都存在相同名字的方法時,子類的方法覆蓋了父類的方法,在代碼運(yùn)行時,會調(diào)用子類的方法;
注:多態(tài)實(shí)現(xiàn)了開發(fā)-封閉原則:
①對擴(kuò)展開放(Open for extension):允許子類重寫方法函數(shù);
②對修改封閉(Closed for modification):不重寫,直接繼承父類方法函數(shù);
Python類的其他知識
(1)python中self和cls的區(qū)別:
① self表示一個具體的實(shí)例本身,相當(dāng)于php的this。如果用了staticmethod,那么就可以無視這個self,將這個方法當(dāng)成一個普通的函數(shù)使用;
② cls表示這個類本身;
@staticmethod:只能用類名去調(diào)用的方法;
@classmethod:既能用實(shí)例去調(diào)用,也能用類名去調(diào)用的方法;
(2)多重繼承的方法搜索順序:
對于多數(shù)應(yīng)用來說,在最簡單的情況下,你可以認(rèn)為搜索從父類所繼承屬性的操作是深度優(yōu)先、從左至右的,當(dāng)層次結(jié)構(gòu)中存在重疊時不會在同一個類中搜索兩次。 因此,如果某一屬性在 DerivedClassName 中未找到,則會到 Base1 中搜索它,然后(遞歸地)到 Base1 的基類中搜索,如果在那里未找到,再到 Base2 中搜索,依此類推。
真實(shí)情況比這個更復(fù)雜一些;方法解析順序會動態(tài)改變以支持對 super() 的協(xié)同調(diào)用。 這種方式在某些其他多重繼承型語言中被稱為后續(xù)方法調(diào)用,它比單繼承型語言中的 super 調(diào)用更強(qiáng)大。
動態(tài)改變順序是有必要的,因?yàn)樗卸嘀乩^承的情況都會顯示出一個或更多的菱形關(guān)聯(lián)(即至少有一個父類可通過多條路徑被最底層類所訪問)。 例如,所有類都是繼承自 object,因此任何多重繼承的情況都提供了一條以上的路徑可以通向 object。 為了確保基類不會被訪問一次以上,動態(tài)算法會用一種特殊方式將搜索順序線性化, 保留每個類所指定的從左至右的順序,只調(diào)用每個父類一次,并且保持單調(diào)(即一個類可以被子類化而不影響其父類的優(yōu)先順序)。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
- Python面向?qū)ο笾惡蛯?shí)例用法分析
- python中的實(shí)例方法、靜態(tài)方法、類方法、類變量和實(shí)例變量淺析
- 跟老齊學(xué)Python之編寫類之一創(chuàng)建實(shí)例
- python的類變量和成員變量用法實(shí)例教程
- Python中的對象,方法,類,實(shí)例,函數(shù)用法分析
- Python中Class類用法實(shí)例分析
- python中子類繼承父類的__init__方法實(shí)例
- Python實(shí)現(xiàn)類繼承實(shí)例
- python類繼承與子類實(shí)例初始化用法分析
- 基于python3 類的屬性、方法、封裝、繼承實(shí)例講解
相關(guān)文章
Python3利用Qt5實(shí)現(xiàn)簡易的五子棋游戲
這篇文章主要為大家詳細(xì)介紹了Python3利用Qt5實(shí)現(xiàn)簡易的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧詳解(3)
這篇文章主要為大家詳細(xì)介紹了Python中的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03pandas 缺失值與空值處理的實(shí)現(xiàn)方法
這篇文章主要介紹了pandas 缺失值與空值處理的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10python+opencv實(shí)現(xiàn)高斯平滑濾波
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)高斯平滑濾波,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12用python實(shí)現(xiàn)爬取奧特曼圖片實(shí)例
大家好,本篇文章主要講的是用python實(shí)現(xiàn)爬取奧特曼圖片實(shí)例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02python 匿名函數(shù)與三元運(yùn)算學(xué)習(xí)筆記
這篇文章主要介紹了python 匿名函數(shù)與三元運(yùn)算的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python 編程,感興趣的朋友可以了解下2020-10-10Python中url標(biāo)簽使用知識點(diǎn)總結(jié)
這篇文章主要介紹了Python中url標(biāo)簽使用知識點(diǎn)以及相關(guān)實(shí)例代碼,需要的朋友們參考下。2020-01-01