網站首頁 編程語言 正文
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 是沒有真正意義上的私有的,當知道了其內部處理方式后,依然可以使用_類名__屬性名(方法名)的方法來在對象外部訪問到對象內部定義的私有屬性和私有方法。
但這種方式在日常工作中是不推薦使用的,既然在對象內部定義屬性和方法時,就聲明了其為私有的,調用方就需要遵守其規則。
原文鏈接:https://blog.csdn.net/AI_Green/article/details/123182514
相關推薦
- 2022-06-06 canvas保存圖片時,谷歌瀏覽器Chrome報錯解決方案Not allowed to naviga
- 2022-12-12 flutter?Bloc?更新后事件同步與異步詳解_Android
- 2022-02-11 小程序如何把參數設置為全局變量
- 2022-06-29 python人工智能tensorflow常用激活函數Activation?Functions_pyt
- 2022-08-10 C++?和?C#?中的?lambda的方法技巧_C 語言
- 2023-10-10 前端的多種克隆方式和注意事項
- 2022-05-11 RabbitMq工作模式深度剖析與Spring整合MQ
- 2022-05-19 nginx中封禁ip和允許內網ip訪問的實現示例_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支