目錄
一、知識點
二、舉例說明
三、完整程式碼
首頁 後端開發 Python教學 Python存取限制私有還是公有的介紹(附範例)

Python存取限制私有還是公有的介紹(附範例)

Oct 16, 2018 pm 03:50 PM
python

這篇文章帶給大家的內容是關於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'
登入後複製

但是,如果外部程式碼要取得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 <= score <= 100:  
        self.__score = score 
    else:              
        raise ValueError(&#39;bad score&#39;)
登入後複製

那作為雙底線開頭的私有實例變數是不是一定不能從外部存取?其實也不是。
不能直接存取__name是因為Python解釋器對外把__name變數改成了_Student__name,所以仍然可以透過_Student__name來存取__name變數。

>>> 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 <= score <= 100:  
            self.__score = score 
        else:              
            raise ValueError(&#39;bad score&#39;)   
            
    def _private_1 (name):
        return &#39;hello,%s &#39; % name
    def _private_2 (name):
        return &#39;hi , %s &#39; % name
    def greeting(name):
        if len(name) > 3:
            return _private_1 (name)
        else:
            return _private_2 (name)
登入後複製

以上是Python存取限制私有還是公有的介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

vs code 可以在 Windows 8 中運行嗎 vs code 可以在 Windows 8 中運行嗎 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

visual studio code 可以用於 python 嗎 visual studio code 可以用於 python 嗎 Apr 15, 2025 pm 08:18 PM

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

vscode 擴展是否是惡意的 vscode 擴展是否是惡意的 Apr 15, 2025 pm 07:57 PM

VS Code 擴展存在惡意風險,例如隱藏惡意代碼、利用漏洞、偽裝成合法擴展。識別惡意擴展的方法包括:檢查發布者、閱讀評論、檢查代碼、謹慎安裝。安全措施還包括:安全意識、良好習慣、定期更新和殺毒軟件。

See all articles