聊聊Python私有屬性與私有方法
1、 場景定義
私有屬性
是指在Python 的物件導向開發過程中,物件的某些屬性只想在對象的內部被使用,但不想在外部被存取到這些屬性。
即:私有屬性是物件不願意公開的屬性。
私有方法
是指在Python 的物件導向開發過程中,物件的某些方法或稱為函數只想在物件的內部被使用,但不想在外部被存取到這些方法或函數。
即:私有方法是物件不願意公開的方法或函數。
2、語法定義
在Python 中定義私有屬性和私有方法的語法如下:
class Staff: def __init__(self, s_name, s_salary): self.s_name = s_name self.__salary = s_salary def __secret(self): print("%s 的工资是 %d" % (self.s_name, self.__salary))
(1). __salary是以兩個底線開頭來定義的私有屬性。
(2). __secret(self)是以兩個底線開頭來定義的私有方法。
3、 呼叫分析
(1). 在__init__的物件初始化方法中,以兩個底線開頭定義的__salary屬性就是私有屬性。
現在在物件的外部來呼叫一下__salary屬性,看看是否能正常存取該私有屬性。
從上圖執行結果可以看出,第11行,即在物件外部存取物件的私有屬性__salary 時,提示AttributeError 錯誤,Staff 物件zhangsan 沒有屬性__salary。
為了證明 Staff 類別物件確實是有__salary 這個實例屬性的,只是因為在物件外部不能存取私有屬性。
我把 self.__salary 修改為:self.salary,__secret(self)方法對self.__salary屬性的引用,做對應的修改,看如下圖所示的運行結果。
可以從執行結果看出,這個非私有屬性在外部的呼叫是正常的,沒有提示 AttributeError 錯誤。
(2). 在 __secret(self) 實例方法中,以兩個底線開頭定義的__secret(self)方法就是私有方法。
和上面測試流程一樣,先在物件的外部來呼叫私有方法__secret(self),看是否能正常呼叫該私有方法。
從上圖執行結果可以看出,第11行,即在物件外部存取物件的私有方法__secret(self) 時,提示AttributeError 錯誤,Staff 對象zhangsan 沒有__secret 方法。
為了證明 Staff 類別物件是有__secret(self)這個實例方法的,只是因為在物件外部不能存取私有方法。
我把 __secret(self) 方法修改為:secret(self),其他程式碼不變,看如下圖的運行結果。
可以從執行結果看出,這種非私有方法在外部的呼叫是正常的,沒有提示 AttributeError 錯誤。
(3). 從下圖可以看出,在物件內部私有方法與私有屬性是可以被呼叫的。
如圖中的 work 方法呼叫了私有方法__secret(self),而私有方法__secret(self)呼叫了私有屬性__salary。
在物件外部使用 Staff 類別物件 zhangsan 來呼叫 work 方法,可以間接存取到物件的私有屬性和私有方法。
從控制台輸出結果來看 work 方法能正常存取到物件內部定義的私有屬性和私有方法。
4、 Python偽私有屬性和私有方法
在Python 中,並沒有真正意義上的私有,因為Python 內部在為屬性、方法命名時,對名稱做了一些特殊處理,使得外界無法存取對應的屬性和方法。
以私有屬性與私有方法為例,Python內部處理方式為:
(1). 屬性: __salary,經過處理後的屬性名稱為:_Staff__salary(_類別名稱__屬性名稱)
(2). 方法: __secret,經過處理後的方法名稱為:_Staff__secret(_類別名稱__方法名稱)
知道了Python 內部對於私有屬性和私有方法的處理,現在使用這種處理後的命名方式來在物件外部存取私有屬性和私有方法,看看是否能存取正常。
class Staff: def __init__(self, s_name, s_salary): self.s_name = s_name self.__salary = s_salary def __secret(self): return "%s的工资是 %d" % (self.s_name, self.__salary) zhangsan = Staff("张三", 10000) print(zhangsan._Staff__salary) print(zhangsan._Staff__secret())
運行結果如下圖所示
控制台沒有拋任何的例外,之前的提示 AttributeError 錯誤也沒有了。
這個例子證明了Python 是沒有真正意義上的私有的,當知道了其內部處理方式後,依然可以使用_類名__屬性名(方法名)的方法來在對像外部訪問到物件內部定義的私有屬性和私有方法。
但這種方式在日常工作中是不建議使用的,既然在物件內部定義屬性和方法時,就宣告了其為私有的,呼叫方就需要遵守其規則。
這裡只是想透過這個小例子來說明 Python 並無真正意義上的私有。
以上是聊聊Python私有屬性與私有方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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