Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的定義、實(shí)例化、封裝及私有變量/方法詳解
本文實(shí)例講述了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的定義、實(shí)例化、封裝及私有變量/方法。分享給大家供大家參考,具體如下:
1. 定義類
python中定義一個(gè)類的格式如下:
class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 def __func1(self): print("MyClass類的私有方法被調(diào)用!") def print_data(self): self.__func1() print(self.__data1) print(self.data2) def setData(self,data): self.__data1=data class1=MyClass('first_data','sencond_data') class1.print_data() class1._MyClass__func1()
類通過(guò)關(guān)鍵字 class 引導(dǎo),后跟類的名稱,通常第一個(gè)字母大寫,類名稱MyClass后的括號(hào)內(nèi)的object表示該類的父類,如果定義的類沒(méi)有顯明從哪個(gè)類繼承來(lái)的,就在括號(hào)內(nèi)使用object,object類是所有類的父類。
__init__
是定義的類的構(gòu)造函數(shù),可以對(duì)類的變量進(jìn)行初始化,每當(dāng)該類被實(shí)例化的時(shí)候,就會(huì)先執(zhí)行該構(gòu)造函數(shù)。
在類中定義的函數(shù)的一個(gè)參數(shù)一定要是self
,代表類當(dāng)前的實(shí)例化對(duì)象,但在調(diào)用時(shí),不需要傳遞這個(gè)參數(shù)。
2. 類的實(shí)例
類的實(shí)例化方法如下:
obj=MyClass(x,x)
obj是類的實(shí)例化對(duì)象,MyClass是類名,括號(hào)內(nèi)的變量是類的初始化變量(如果類中有定義的話)。
情況一: 類的初始屬性為空
class MyClass(object): def __init__(self): print("MyClass類的構(gòu)造方法被調(diào)用!") class1=MyClass()
情況二: 類含有初始屬性
class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 class1=MyClass('first_data','sencond_data') print(class1.data2)
3. 類的封裝
封裝、繼承和多態(tài)是類的三大特征。類的封裝有兩層含義,一個(gè)是對(duì)數(shù)據(jù)的封裝,一個(gè)是對(duì)實(shí)現(xiàn)邏輯即方法的封裝。
數(shù)據(jù)(屬性)的封裝
還看上一個(gè)例子:
class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 class1=MyClass('first_data','sencond_data') print(class1.data2)
在這里類MyClass的實(shí)例化對(duì)象class1就具有了兩個(gè)屬性,分別是data1和data2,data1是私有屬性,只能在類內(nèi)使用,data2是公有屬性,可以在類外使用。data1和data2就是對(duì)數(shù)據(jù)(屬性)的封裝。
實(shí)現(xiàn)邏輯(方法)的封裝
class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 def printMax(self): if self.__data1>self.data2: print(self.__data1) else: print(self.data2) class1=MyClass(66,88) class1.printMax()
上邊類中的printMax函數(shù)實(shí)現(xiàn)了比較兩個(gè)數(shù)據(jù)大小并打印的功能,這個(gè)實(shí)現(xiàn)邏輯在類外部來(lái)說(shuō)是看不到的,只可以調(diào)用該接口,相當(dāng)于一個(gè)黑箱子,這就是實(shí)現(xiàn)邏輯(方法)的封裝。
4. 類的私有屬性
可以在類內(nèi)定義類的私有屬性和方法,私有的表明只屬于類內(nèi)部的,在類外部是不可以直接訪問(wèn)的,python定義私有屬性和私有方法的方法是在名稱前加上兩個(gè)下劃線 “__”。
私有屬性(變量)
class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 class1=MyClass(66,88) print(class1.data2) print(class1.__data1)
上例中data2是公有變量,可以在類外訪問(wèn),所有calss1.data2沒(méi)有問(wèn)題。 data1是類的私有屬性,類外不可以訪問(wèn),使用 class1.__data1會(huì)報(bào)錯(cuò) 'MyClass' object has no attribute '__data1' 。
私有方法
class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 def __func1(self): print("MyClass類的私有方法被調(diào)用!") def print_data(self): self.__func1() print(self.__data1) print(self.data2) class1=MyClass(66,88) class1.print_data() #class1.__func1()
上例中 print_data方法是類的公有方法,可以在類外直接調(diào)用, __func1方法是類的私有方法,不可以在類外調(diào)用,但是可以通過(guò)類內(nèi)的print_data方法調(diào)用私有的__func1方法,即私有的方法可以在類的內(nèi)部被調(diào)用。
5. 類外訪問(wèn)類的私有屬性
類的私有屬性保證了外部代碼不能隨意訪問(wèn)/更改對(duì)象內(nèi)部的數(shù)據(jù)和方法。
但是對(duì)類內(nèi)私有屬性,在類外仍然可以通過(guò)以下兩種 方式進(jìn)行訪問(wèn)和修改,一是通過(guò)類內(nèi)的公有函數(shù)修改,一是“非法修改”。
通過(guò)類內(nèi)的公有函數(shù)修改
class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 def setData1(self,data): self.__data1=data def printData1(self): print(self.__data1) class1=MyClass(66,88) class1.setData1(100) class1.printData1()
非法修改
python中類的私有屬性或方法之所以不能直接從類外部進(jìn)行訪問(wèn),是因?yàn)閜ython解釋器把私有的屬性或方法 __xx 對(duì)外展示成了 _Class__xx,即單下劃線+類名+__xx 。所以如果你執(zhí)意,仍然可以在類外部通過(guò)這個(gè)改變后的名稱“非法”訪問(wèn)私有屬性。
class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 self.data2=data2 def printData1(self): print(self.__data1) class1=MyClass(66,88) print(class1._MyClass__data1)
當(dāng)然一般不建議這么干,不同的python編譯器可能把私有屬性/方法包裝成不同的名字。
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python requests抓取one推送文字和圖片代碼實(shí)例
這篇文章主要介紹了python requests抓取one推送文字和圖片代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11tensorflow實(shí)現(xiàn)對(duì)張量數(shù)據(jù)的切片操作方式
今天小編就為大家分享一篇tensorflow實(shí)現(xiàn)對(duì)張量數(shù)據(jù)的切片操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Numpy之random函數(shù)使用學(xué)習(xí)
這篇文章主要介紹了Numpy之random使用學(xué)習(xí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01Python數(shù)據(jù)分析Matplotlib?柱狀圖繪制
本文主要介紹了Python數(shù)據(jù)分析Matplotlib柱狀圖繪制,Matplotlib提供了bar()方法繪制柱狀圖,下面具體繪制介紹需要的小伙伴可以參考以一下2022-05-05Python?opencv應(yīng)用實(shí)現(xiàn)圖片切分操作示例
這篇文章主要為大家介紹了Python?opencv應(yīng)用實(shí)現(xiàn)圖片切分的操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06python的print輸出在控制臺(tái)并且將輸出內(nèi)容保存為文件(最新推薦)
這篇文章主要介紹了python的print輸出在控制臺(tái)并且將輸出內(nèi)容保存為文件,我感覺(jué)就是類似于重寫一下調(diào)用print的時(shí)候執(zhí)行的方法,讓他既能夠在控制臺(tái)輸出,也能保存到文件里去,需要的朋友可以參考下2023-01-01