這篇文章帶給大家的內容是關於Python訪問限制私有還是公有的介紹(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
一、知識點
在一個模組中,我們可能會定義很多函數和變數。但有的函數和變數我們希望能給別人使用,有的函數和變數我們希望僅僅在模組內部使用,so?
我們可以透過定義該函數、變數是公開的還是私有的來達到該目的。
在Python中,是透過下劃線「_」前綴來實現的。
public:公開的。正常的函數和變數名為此類型,可以直接引用。例如變數abc、PI等;
特殊變數:格式為__xxx__ ,以__開頭、以__結尾。可以直接被引用,但有特殊用途。例如 __author__ 、__name__就是特殊變數。一般自己定義的變數不要用這種變數名。
private:私有的、非公開的,格式類似_xxx_ 和__xxx,例如__num。
不應該直接引用,只有內部可以訪問,外部不能訪問。
不能隨意修改物件內部的狀態,這樣透過存取限制的保護,程式碼更加健壯。
二、舉例說明
在Class類別內部,可以有屬性和方法。而外部程式碼可以透過直接呼叫實例變數的方法來操作數據,隱藏了內部複雜邏輯。但是,外部程式碼還是可以自由地修改一個實例的屬性。例如:
>>>b.score 99 >>>b.score = 59 >>>b.score 59
如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個底線“__”,變成私有變量,如下:
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score))
嘗試在外部對屬性進行訪問,發現會報錯,因為私有變量,不能被外部訪問。
>>> bart = Student('Bart Simpson', 98) >>> bart.__name # 私有变量:不能被外部访问 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Student' object has no attribute '__name'</module></stdin>
但是,如果外部程式碼要取得name和score怎麼辦?
為Student類別增加取得屬性的方法:get_name()和get_score(),如下:
class Student(object): ... def get_name(self): return self.__name def get_score(self): return self.__score
如果外部程式碼修改score怎麼辦?可以再給Student類別增加設定方法:set_score()
:
... def set_score(self, score): # 避免传入无效参数 if 0 <p>那作為雙底線開頭的私有實例變數是不是一定不能從外部存取?其實也不是。 <br>不能直接存取__name是因為Python解釋器對外把__name變數改成了_Student__name,所以仍然可以透過_Student__name來存取__name變數。 </p><pre class="brush:php;toolbar:false">>>> bart = Student('Bart Simpson', 98) >>> bart.get_name() 'Bart Simpson' >>> bart.__name = 'New Name' # 给bart新增的__name变量 >>> bart.__name # !与class内部的__name变量不是一个变量! 'New Name' >>> bart.get_name() # get_name()内部返回self.__name (_Student__name) 'Bart Simpson'
表面上看,外部程式碼「成功」地設定了__name變量,但實際上這個__name變數和class內部的__name變數不是一個變數!內部的__name變數已經被Python解釋器自動改成了_Student__name,而外部程式碼為bart新增了一個__name變數。
所以python並沒有一種方法可以完全限制訪問private的函數或變量,所以不是“不能被直接引用”,從編程的習慣上不應該引用private函數或變量。那他們的用處呢?
例如:
def _private_1 (name): return 'hello,%s ' % name def _private_2 (name): return 'hi , %s ' % name def greeting(name): if len(name) > 3: return _private_1 (name) else: return _private_2 (name)
在模組裡公開greeting()函數,而把內部邏輯用private函數隱藏起來了。這樣,呼叫greeting()函數就不用關心內部的私有函數的細節。
這是一個非常有用的程式碼封裝和抽象的方法,即:外部不需要引用的函數全部定義成private,只有外部需要引用的函數才定義為public。
三、完整程式碼
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score)) def get_name(self): return self.__name def get_score(self): return self.__score def set_score(self, score): # 避免传入无效参数 if 0 3: return _private_1 (name) else: return _private_2 (name)
以上是Python存取限制私有還是公有的介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Python3.6環境下加載Pickle文件報錯:ModuleNotFoundError:Nomodulenamed...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

WebStorm Mac版
好用的JavaScript開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器