一、私有屬性
二、屬性限制-__slots__方法
三、python中如何去聲明變量
四、python中的有關屬性
一、私有屬性Python並沒有真正的私有化支持,但可用下劃線得到偽私有,有一項大多數 Python 代碼都遵循的習慣:帶有下劃線,前綴的名稱應被視為非公開的 API 的一部分(無論是函數、 方法還是數據 成員)
python中私有並沒有實現真正的私有,只是在保存屬性的時候改了個名字,在外部無法直接方法
私有屬性具體表現為:
_參數名 : 聲明式私有屬性
__參數名 : _類名 + 私有屬性名
class Attributes: attr = 100 # 聲明式私有屬性 _attr2 = 999 # _類名 + 私有屬性名 __attr3 = 888print(Attributes.attr)print(Attributes._attr2)
雙下劃線的私有屬性,在去調用的時候 ,並沒有__attr3 這個屬性名,用 dict 屬性,去查看屬性字典看下:
可以看到是雙下劃線的私有屬性是:_類名 + 私有屬性名
定義過slots屬性來限制類實例的屬性,只能綁定slots指定的屬性,不能添加slots之外的屬性
添加slots之外的屬性,會直接報錯
class Demo: 使用__slots__ 給對象做屬性限制,只能添加指定屬性name,age __slots__ = ['name', 'age'] m = Demo()m.name = 111m.age = 18print(m.name,m.age)再去添加指定屬性之外的屬性m.sex= 男
執行結果:
報錯:AttributeError: ‘Demo’ object has no attribute ‘sex’ 對象Demo沒有 ‘sex’ 這個屬性
語法:參數,屬性的類型
例如: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 99m = MyDemo()print("************************* 屬性設置 ******************************")# 屬性設置# 設置屬性方式一:m.aa = 999m.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')
到此這篇關於python中的屬性管理機制的文章就介紹到這了,更多相關python屬性管理內容請搜索軟件開發網以前的文章或繼續浏覽下面的相關文章希望大家以後多多支持軟件開發網!