一文帶你搞懂Python類的訪問控制
一、訪問控制的本質(zhì):數(shù)據(jù)安全與接口設(shè)計(jì)
1.1 類屬性和方法的訪問控制
一般情況下,我們會(huì)使用 __private_attrs 兩個(gè)下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。在類內(nèi)部的方法中使用時(shí) self.__private_attrsPython作為動(dòng)態(tài)語言,打破了傳統(tǒng)OOP語言對(duì)訪問控制的剛性限制。同理類方法的訪問控制與屬性一樣。
class Student:
def __init__(self, score, name):
self.name = name # 公有屬性, 可以直接被訪問
self.__score = score # 私有屬性, 不能被直接訪問,但是可以通過雙下劃線實(shí)現(xiàn)Name Mangling訪問
def get_score(self): # 公有方法, 可以直接被訪問
return self.__score
def __get_score(self): # 私有方法, 不能被直接訪問,但是可以通過雙下劃線實(shí)現(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
這段代碼看似實(shí)現(xiàn)了信息隱藏,實(shí)際通過_Student__score仍可訪問。這種"約定優(yōu)于限制"的設(shè)計(jì)哲學(xué),體現(xiàn)了Pythonic的核心思想。
1.2 類專有的方法
| 方法 | 說明 |
|---|---|
| __init__ | 構(gòu)造函數(shù),在生成對(duì)象時(shí)調(diào)用 |
| __del__ | 析構(gòu)函數(shù),釋放對(duì)象時(shí)使用 |
| __repr__ | 打印,轉(zhuǎn)換 |
| __setitem__ | 按照索引賦值 |
| __getitem__ | 按照索引獲取值 |
| __len__ | 獲得長度 |
| __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í)候我們需要獲取類的相關(guān)信息,我們可以使用如下的方法:
type(obj):來獲取對(duì)象的相應(yīng)類型;isinstance(obj, type):判斷對(duì)象是否為指定的 type 類型的實(shí)例;hasattr(obj, attr):判斷對(duì)象是否具有指定屬性/方法;getattr(obj, attr[, default])獲取屬性/方法的值, 要是沒有對(duì)應(yīng)的屬性則返回 default 值(前提是設(shè)置了 default),否則會(huì)拋出 AttributeError 異常;setattr(obj, attr, value):設(shè)定該屬性/方法的值,類似于 obj.attr=value;dir(obj):可以獲取相應(yīng)對(duì)象的所有屬性和方法名的列表
二、訪問器模式的現(xiàn)代寫法(@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中可以加入類型檢查、范圍驗(yàn)證、歷史記錄等增強(qiáng)功能
三、總結(jié)
| 控制級(jí)別 | 定義方式 | 可訪問范圍 | 使用場景 |
|---|---|---|---|
| 公有成員 | name | 任意位置 | 對(duì)外暴露的完整接口 |
| 保護(hù)成員 | _name (單下劃線) | 本類及子類 | 內(nèi)部實(shí)現(xiàn)但允許繼承擴(kuò)展 |
| 私有成員 | __name | 本類內(nèi)部 | 絕對(duì)私有防止外部干擾 |
到此這篇關(guān)于一文帶你搞懂Python類的訪問控制的文章就介紹到這了,更多相關(guān)Python類訪問控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas 強(qiáng)制類型轉(zhuǎn)換 df.astype實(shí)例
這篇文章主要介紹了pandas 強(qiáng)制類型轉(zhuǎn)換 df.astype實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Django實(shí)現(xiàn)WebSocket在線聊天室功能(channels庫)
本文基于channels庫Django實(shí)現(xiàn)WebSocket在線聊天室功能,包括安裝及創(chuàng)建django項(xiàng)目的全過程,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Playwright中Assertions斷言的方法實(shí)現(xiàn)
在編寫測試時(shí),我們使用assert語句來斷言一段條件并以此為基礎(chǔ)條件,我們要么通過測試,要么不通過測試,Playwright給我們提供了另一個(gè)API,可以以一種更易讀的方式用來執(zhí)行相同的判斷2026-01-01
Python繪制TSP、VRP問題求解結(jié)果圖全過程
本文介紹用Python繪制TSP和VRP問題的靜態(tài)與動(dòng)態(tài)結(jié)果圖,靜態(tài)圖展示路徑,動(dòng)態(tài)圖通過matplotlib.animation模塊實(shí)現(xiàn)動(dòng)畫效果,保存為GIF需安裝PIL庫支持2025-09-09
Python基于sftp及rsa密匙實(shí)現(xiàn)遠(yuǎn)程拷貝文件的方法
這篇文章主要介紹了Python基于sftp及rsa密匙實(shí)現(xiàn)遠(yuǎn)程拷貝文件的方法,結(jié)合實(shí)例形式分析了基于RSA秘鑰遠(yuǎn)程登陸及文件操作的相關(guān)技巧,需要的朋友可以參考下2016-09-09
python數(shù)據(jù)可視化之matplotlib.pyplot基礎(chǔ)以及折線圖
不論是數(shù)據(jù)挖掘還是數(shù)據(jù)建模,都免不了數(shù)據(jù)可視化的問題,對(duì)于Python來說,Matplotlib是最著名的繪圖庫,它主要用于二維繪圖,這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)可視化之matplotlib.pyplot基礎(chǔ)以及折線圖的相關(guān)資料,需要的朋友可以參考下2021-07-07
使用Python在PDF中設(shè)置圖片透明度的操作方法
在 PDF 文檔編輯中,適當(dāng)?shù)卣{(diào)整圖片的透明度,可以幫助實(shí)現(xiàn)更平衡的版面效果,使內(nèi)容層次更清晰、視覺更協(xié)調(diào),助 Free Spire.PDF for Python,我們可以通過簡單的 Python 代碼靈活設(shè)置圖片的透明度,而無需借助復(fù)雜的圖像編輯軟件,需要的朋友可以參考下2025-11-11
tensorflow入門之訓(xùn)練簡單的神經(jīng)網(wǎng)絡(luò)方法
本篇文章主要介紹了tensorflow入門之訓(xùn)練簡單的神經(jīng)網(wǎng)絡(luò)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
Flask Paginate實(shí)現(xiàn)表格分頁的使用示例
flask_paginate是Flask框架的一個(gè)分頁擴(kuò)展,用于處理分頁相關(guān)的功能,本文就來介紹一下Flask Paginate實(shí)現(xiàn)表格分頁的使用示例,感興趣的可以了解一下2023-11-11

