網站首頁 編程語言 正文
一、私有屬性
- Python并沒有真正的私有化支持,但可用下劃線得到偽私有,有一項大多數 Python 代碼都遵循的習慣:帶有下劃線,前綴的名稱應被視為非公開的 API 的一部分(無論是函數、 方法還是數據 成員)
- python中私有并沒有實現真正的私有,只是在保存屬性的時候改了個名字,在外部無法直接方法
私有屬性具體表現為:
- _參數名 : 聲明式私有屬性
- __參數名 : _類名 + 私有屬性名
class Attributes:
attr = 100
# 聲明式私有屬性
_attr2 = 999
# _類名 + 私有屬性名
__attr3 = 888
print(Attributes.attr)
print(Attributes._attr2)
雙下劃線的私有屬性,在去調用的時候 ,并沒有__attr3 這個屬性名,用 dict 屬性,去查看屬性字典看下:
可以看到是雙下劃線的私有屬性是:_類名 + 私有屬性名
二、屬性限制-__slots__方法
- 定義過slots屬性來限制類實例的屬性,只能綁定slots指定的屬性,不能添加slots之外的屬性
- 添加slots之外的屬性,會直接報錯
class Demo:
使用__slots__ 給對象做屬性限制,只能添加指定屬性name,age
__slots__ = ['name', 'age']
m = Demo()
m.name = 111
m.age = 18
print(m.name,m.age)
再去添加指定屬性之外的屬性
m.sex= 男
執行結果:
報錯:AttributeError: ‘Demo’ object has no attribute ‘sex’ 對象Demo沒有 ‘sex’ 這個屬性
三、python中如何去聲明變量
語法:參數,屬性的類型
例如:a: int = [11, 22, 3] 參數a ,類型為int ,值為 [11, 22, 3]
python中可以聲明變量或者參數的類型,但是實際上代碼執行是不會去校驗類型
a: int = "python" # 設置的為int類型,但是傳值為字符串類型
b: str = 11 # 設置的為字符串類型,但是傳值為int類型
c: list = {11, 22, 33} # 設置的為列表,但是傳值為字典
print(a, b, c) # ==========》依然可以執行打印出來
# 函數參數的類型聲明:
def work(name: str, age: int): # 設置的為字符串類型 和 int類型
print('name的值為', name)
print('age的值為', age)
# 實際傳參一個列表,一個字典
work([11,22,33],{'a':1,'b':2})
執行結果:
四、python中的有關屬性
__getattr__方法:
用法:獲取屬性,屬性不存在時觸發的方法
特殊流程:當去獲取屬性時,先執行__getattribute__去看有沒有屬性,有就返回,如果沒有就去執行__getattr__方法,返回屬性不存在
getattribute(self, item):
用法:屬性訪問觸發的魔術方法,查找屬性時,第一時間會調用該方法
setattr(self, key, value):
用法:設置屬性的方法,設置屬性時,調用該方法設置屬性
__delattr__方法:
用法:在del 刪除屬性時觸發,刪除屬性的方法
class MyDemo(object):
def __getattribute__(self, item):
"""
屬性訪問觸發的魔術方法
:param item: 獲取的屬性名
:return: 獲取到的屬性值
"""
print("您要獲取的屬性為:", item)
value = super().__getattribute__(item) # 繼承父類
return value
def __setattr__(self, key, value):
"""
設置屬性的方法
:param key:屬性名
:param value: 屬性值
:return:
"""
print("您要設置的屬性名{},屬性值為:{}".format(key, value))
super().__setattr__(key, value)
def __delattr__(self, item):
"""
刪除屬性的方法
:param item: 屬性名
:return:
"""
print("您要刪除的屬性為:", item)
super().__delattr__(item)
def __getattr__(self, item):
"""
獲取屬性,屬性不存在時觸發的方法
:param item:
:return:
"""
print("獲取的屬性{},不存在".format(item))
return 99
m = MyDemo()
print("************************* 屬性設置 ******************************")
# 屬性設置
# 設置屬性方式一:
m.aa = 999
m.name = 'musen'
# 設置屬性方式二:setattr方法:
setattr(MyDemo(), 'age', 18)
print("************************ 獲取屬性 *******************************")
# 獲取屬性
# 方式一:
print(m.aa)
print(m.name)
# 方式二:getattr 方法
print(getattr(m,'name'))
print("************************ 刪除屬性 ********************************")
# 刪除屬性
# 方式一:
del m.aa
# 方式二:delattr 方法
delattr(m, 'age')
原文鏈接:https://blog.csdn.net/qq_40236497/article/details/125415380
相關推薦
- 2022-09-09 Qt?QFtp客戶端實現上傳下載文件_C 語言
- 2022-08-11 python實現對excel中需要的數據的單元格填充顏色_python
- 2023-04-03 C++中using的三種用法舉例詳解_C 語言
- 2022-10-12 常見Android編譯優化問題梳理總結_Android
- 2022-08-28 c++在windows、linux下獲取指定文件夾下所有文件名的方法
- 2022-04-22 頁面跳轉之后后退回來頁面隱藏問題。
- 2022-04-23 C++的原生數組你了解多少_C 語言
- 2022-11-17 Android顯式Intent與隱式Intent的使用詳解_Android
- 最近更新
-
- 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同步修改后的遠程分支