一文帶你搞懂Python類的訪問控制
一、訪問控制的本質:數(shù)據(jù)安全與接口設計
1.1 類屬性和方法的訪問控制
一般情況下,我們會使用 __private_attrs
兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs
Python作為動態(tài)語言,打破了傳統(tǒng)OOP語言對訪問控制的剛性限制。同理類方法的訪問控制與屬性一樣。
class Student: def __init__(self, score, name): self.name = name # 公有屬性, 可以直接被訪問 self.__score = score # 私有屬性, 不能被直接訪問,但是可以通過雙下劃線實現(xiàn)Name Mangling訪問 def get_score(self): # 公有方法, 可以直接被訪問 return self.__score def __get_score(self): # 私有方法, 不能被直接訪問,但是可以通過雙下劃線實現(xiàn)Name Mangling訪問 return self.__score s = Student(100, 'Bob') print(s.name) # 訪問公有屬性 print(s._Student__score) # 訪問私有屬性,Name Mangling print(s.get_score()) # 訪問公有方法 print(s._Student__get_score()) # 訪問私有方法,Name Mangling
這段代碼看似實現(xiàn)了信息隱藏,實際通過_Student__score
仍可訪問。這種"約定優(yōu)于限制"的設計哲學,體現(xiàn)了Pythonic的核心思想。
1.2 類專有的方法
方法 | 說明 |
---|---|
__init__ | 構造函數(shù),在生成對象時調用 |
__del__ | 析構函數(shù),釋放對象時使用 |
__repr__ | 打印,轉換 |
__setitem__ | 按照索引賦值 |
__getitem__ | 按照索引獲取值 |
__len__ | 獲得長度 |
__cmp__ | 比較運算 |
__call__ | 函數(shù)調用 |
__add__ | 加運算 |
__sub__ | 減運算 |
__mul__ | 乘運算 |
__div__ | 除運算 |
__mod__ | 求余運算 |
__pow__ | 乘方 |
當然有些時候我們需要獲取類的相關信息,我們可以使用如下的方法:
type(obj)
:來獲取對象的相應類型;isinstance(obj, type)
:判斷對象是否為指定的 type 類型的實例;hasattr(obj, attr)
:判斷對象是否具有指定屬性/方法;getattr(obj, attr[, default])
獲取屬性/方法的值, 要是沒有對應的屬性則返回 default 值(前提是設置了 default),否則會拋出 AttributeError 異常;setattr(obj, attr, value)
:設定該屬性/方法的值,類似于 obj.attr=value;dir(obj)
:可以獲取相應對象的所有屬性和方法名的列表
二、訪問器模式的現(xiàn)代寫法(@property進階)
傳統(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)
實戰(zhàn)技巧:在setter中可以加入類型檢查、范圍驗證、歷史記錄等增強功能
三、總結
控制級別 | 定義方式 | 可訪問范圍 | 使用場景 |
---|---|---|---|
公有成員 | name | 任意位置 | 對外暴露的完整接口 |
保護成員 | _name (單下劃線) | 本類及子類 | 內部實現(xiàn)但允許繼承擴展 |
私有成員 | __name | 本類內部 | 絕對私有防止外部干擾 |
到此這篇關于一文帶你搞懂Python類的訪問控制的文章就介紹到這了,更多相關Python類訪問控制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
PyTorch?Tensor創(chuàng)建實現(xiàn)
本文主要介紹了PyTorch?Tensor創(chuàng)建實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06python中用cantools和can工具包解析blf文件的方法
這篇文章主要給大家介紹了關于python中用cantools和can工具包解析blf文件的相關資料,blf數(shù)據(jù)不像mf4那樣自帶信號數(shù)據(jù)庫,因為它是記日志用的,一般情況下要盡可能的小,需要的朋友可以參考下2023-09-09python tqdm 實現(xiàn)滾動條不上下滾動代碼(保持一行內滾動)
這篇文章主要介紹了python tqdm 實現(xiàn)滾動條不上下滾動代碼(保持一行內滾動),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02