一文帶你搞懂Python類(lèi)的訪(fǎng)問(wèn)控制
一、訪(fǎng)問(wèn)控制的本質(zhì):數(shù)據(jù)安全與接口設(shè)計(jì)
1.1 類(lèi)屬性和方法的訪(fǎng)問(wèn)控制
一般情況下,我們會(huì)使用 __private_attrs 兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該屬性為私有,不能在類(lèi)地外部被使用或直接訪(fǎng)問(wèn)。在類(lèi)內(nèi)部的方法中使用時(shí) self.__private_attrsPython作為動(dòng)態(tài)語(yǔ)言,打破了傳統(tǒng)OOP語(yǔ)言對(duì)訪(fǎng)問(wèn)控制的剛性限制。同理類(lèi)方法的訪(fǎng)問(wèn)控制與屬性一樣。
class Student:
def __init__(self, score, name):
self.name = name # 公有屬性, 可以直接被訪(fǎng)問(wèn)
self.__score = score # 私有屬性, 不能被直接訪(fǎng)問(wèn),但是可以通過(guò)雙下劃線(xiàn)實(shí)現(xiàn)Name Mangling訪(fǎng)問(wèn)
def get_score(self): # 公有方法, 可以直接被訪(fǎng)問(wèn)
return self.__score
def __get_score(self): # 私有方法, 不能被直接訪(fǎng)問(wèn),但是可以通過(guò)雙下劃線(xiàn)實(shí)現(xiàn)Name Mangling訪(fǎng)問(wèn)
return self.__score
s = Student(100, 'Bob')
print(s.name) # 訪(fǎng)問(wèn)公有屬性
print(s._Student__score) # 訪(fǎng)問(wèn)私有屬性,Name Mangling
print(s.get_score()) # 訪(fǎng)問(wèn)公有方法
print(s._Student__get_score()) # 訪(fǎng)問(wèn)私有方法,Name Mangling
這段代碼看似實(shí)現(xiàn)了信息隱藏,實(shí)際通過(guò)_Student__score仍可訪(fǎng)問(wèn)。這種"約定優(yōu)于限制"的設(shè)計(jì)哲學(xué),體現(xiàn)了Pythonic的核心思想。
1.2 類(lèi)專(zhuān)有的方法
| 方法 | 說(shuō)明 |
|---|---|
| __init__ | 構(gòu)造函數(shù),在生成對(duì)象時(shí)調(diào)用 |
| __del__ | 析構(gòu)函數(shù),釋放對(duì)象時(shí)使用 |
| __repr__ | 打印,轉(zhuǎn)換 |
| __setitem__ | 按照索引賦值 |
| __getitem__ | 按照索引獲取值 |
| __len__ | 獲得長(zhǎng)度 |
| __cmp__ | 比較運(yùn)算 |
| __call__ | 函數(shù)調(diào)用 |
| __add__ | 加運(yùn)算 |
| __sub__ | 減運(yùn)算 |
| __mul__ | 乘運(yùn)算 |
| __div__ | 除運(yùn)算 |
| __mod__ | 求余運(yùn)算 |
| __pow__ | 乘方 |
當(dāng)然有些時(shí)候我們需要獲取類(lèi)的相關(guān)信息,我們可以使用如下的方法:
type(obj):來(lái)獲取對(duì)象的相應(yīng)類(lèi)型;isinstance(obj, type):判斷對(duì)象是否為指定的 type 類(lèi)型的實(shí)例;hasattr(obj, attr):判斷對(duì)象是否具有指定屬性/方法;getattr(obj, attr[, default])獲取屬性/方法的值, 要是沒(méi)有對(duì)應(yīng)的屬性則返回 default 值(前提是設(shè)置了 default),否則會(huì)拋出 AttributeError 異常;setattr(obj, attr, value):設(shè)定該屬性/方法的值,類(lèi)似于 obj.attr=value;dir(obj):可以獲取相應(yīng)對(duì)象的所有屬性和方法名的列表
二、訪(fǎng)問(wèn)器模式的現(xiàn)代寫(xiě)法(@property進(jìn)階)
傳統(tǒng)getter/setter模式:
class TemperatureSensor:
def get_temperature(self):
return self._raw_data * 0.8 - 5
def set_temperature(self, value):
if value < -273.15:
raise ValueError("Absolute zero violation")
self._raw_data = (value + 5)/0.8
sensor = TemperatureSensor()
sensor.set_temperature(20)
print(sensor.get_temperature())
現(xiàn)代Python推薦使用更優(yōu)雅的@property裝飾器:
class TemperatureSensor:
@property
def temperature(self):
return self._raw_data * 0.8 - 5
@temperature.setter
def temperature(self, value):
if value < -273.15:
raise ValueError("Invalid temperature")
self._raw_data = (value + 5)/0.8
sensor = TemperatureSensor()
sensor.temperature = 25
print(sensor.temperature)
實(shí)戰(zhàn)技巧:在setter中可以加入類(lèi)型檢查、范圍驗(yàn)證、歷史記錄等增強(qiáng)功能
三、總結(jié)
| 控制級(jí)別 | 定義方式 | 可訪(fǎng)問(wèn)范圍 | 使用場(chǎng)景 |
|---|---|---|---|
| 公有成員 | name | 任意位置 | 對(duì)外暴露的完整接口 |
| 保護(hù)成員 | _name (單下劃線(xiàn)) | 本類(lèi)及子類(lèi) | 內(nèi)部實(shí)現(xiàn)但允許繼承擴(kuò)展 |
| 私有成員 | __name | 本類(lèi)內(nèi)部 | 絕對(duì)私有防止外部干擾 |
到此這篇關(guān)于一文帶你搞懂Python類(lèi)的訪(fǎng)問(wèn)控制的文章就介紹到這了,更多相關(guān)Python類(lèi)訪(fǎng)問(wèn)控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python輪詢(xún)機(jī)制控制led實(shí)例
這篇文章主要介紹了python輪詢(xún)機(jī)制控制led實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
PyCharm的設(shè)置方法和第一個(gè)Python程序的建立
今天小編就為大家分享一篇PyCharm的設(shè)置方法和第一個(gè)Python程序的建立,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
PyTorch?Tensor創(chuàng)建實(shí)現(xiàn)
本文主要介紹了PyTorch?Tensor創(chuàng)建實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Python中不同類(lèi)之間調(diào)用方法的四種方式小結(jié)
類(lèi)是一種面向?qū)ο蟮木幊谭妒?它允許我們將數(shù)據(jù)和功能封裝在一個(gè)實(shí)體中,本文主要介紹了Python中不同類(lèi)之間調(diào)用方法的四種方式小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
python中用cantools和can工具包解析blf文件的方法
這篇文章主要給大家介紹了關(guān)于python中用cantools和can工具包解析blf文件的相關(guān)資料,blf數(shù)據(jù)不像mf4那樣自帶信號(hào)數(shù)據(jù)庫(kù),因?yàn)樗怯浫罩居玫?一般情況下要盡可能的小,需要的朋友可以參考下2023-09-09
python tqdm 實(shí)現(xiàn)滾動(dòng)條不上下滾動(dòng)代碼(保持一行內(nèi)滾動(dòng))
這篇文章主要介紹了python tqdm 實(shí)現(xiàn)滾動(dòng)條不上下滾動(dòng)代碼(保持一行內(nèi)滾動(dòng)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
django創(chuàng)建最簡(jiǎn)單HTML頁(yè)面跳轉(zhuǎn)方法
今天小編就為大家分享一篇django創(chuàng)建最簡(jiǎn)單HTML頁(yè)面跳轉(zhuǎn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

