python中的屬性管理機(jī)制詳解
一、私有屬性
- Python并沒有真正的私有化支持,但可用下劃線得到偽私有,有一項(xiàng)大多數(shù) Python 代碼都遵循的習(xí)慣:帶有下劃線,前綴的名稱應(yīng)被視為非公開的 API 的一部分(無論是函數(shù)、 方法還是數(shù)據(jù) 成員)
- python中私有并沒有實(shí)現(xiàn)真正的私有,只是在保存屬性的時候改了個名字,在外部無法直接方法
私有屬性具體表現(xiàn)為:
- _參數(shù)名 : 聲明式私有屬性
- __參數(shù)名 : _類名 + 私有屬性名
class Attributes: attr = 100 # 聲明式私有屬性 _attr2 = 999 # _類名 + 私有屬性名 __attr3 = 888 print(Attributes.attr) print(Attributes._attr2)
雙下劃線的私有屬性,在去調(diào)用的時候 ,并沒有__attr3 這個屬性名,用 dict 屬性,去查看屬性字典看下:
可以看到是雙下劃線的私有屬性是:_類名 + 私有屬性名
二、屬性限制-__slots__方法
- 定義過slots屬性來限制類實(shí)例的屬性,只能綁定slots指定的屬性,不能添加slots之外的屬性
- 添加slots之外的屬性,會直接報(bào)錯
class Demo: 使用__slots__ 給對象做屬性限制,只能添加指定屬性name,age __slots__ = ['name', 'age'] m = Demo() m.name = 111 m.age = 18 print(m.name,m.age) 再去添加指定屬性之外的屬性 m.sex= 男
執(zhí)行結(jié)果:
報(bào)錯:AttributeError: ‘Demo’ object has no attribute ‘sex’ 對象Demo沒有 ‘sex’ 這個屬性
三、python中如何去聲明變量
語法:參數(shù),屬性的類型
例如:a: int = [11, 22, 3] 參數(shù)a ,類型為int ,值為 [11, 22, 3]
python中可以聲明變量或者參數(shù)的類型,但是實(shí)際上代碼執(zhí)行是不會去校驗(yàn)類型
a: int = "python" # 設(shè)置的為int類型,但是傳值為字符串類型 b: str = 11 # 設(shè)置的為字符串類型,但是傳值為int類型 c: list = {11, 22, 33} # 設(shè)置的為列表,但是傳值為字典 print(a, b, c) # ==========》依然可以執(zhí)行打印出來 # 函數(shù)參數(shù)的類型聲明: def work(name: str, age: int): # 設(shè)置的為字符串類型 和 int類型 print('name的值為', name) print('age的值為', age) # 實(shí)際傳參一個列表,一個字典 work([11,22,33],{'a':1,'b':2})
執(zhí)行結(jié)果:
四、python中的有關(guān)屬性
__getattr__方法:
用法:獲取屬性,屬性不存在時觸發(fā)的方法
特殊流程:當(dāng)去獲取屬性時,先執(zhí)行__getattribute__去看有沒有屬性,有就返回,如果沒有就去執(zhí)行__getattr__方法,返回屬性不存在
getattribute(self, item):
用法:屬性訪問觸發(fā)的魔術(shù)方法,查找屬性時,第一時間會調(diào)用該方法
setattr(self, key, value):
用法:設(shè)置屬性的方法,設(shè)置屬性時,調(diào)用該方法設(shè)置屬性
__delattr__方法:
用法:在del 刪除屬性時觸發(fā),刪除屬性的方法
class MyDemo(object): def __getattribute__(self, item): """ 屬性訪問觸發(fā)的魔術(shù)方法 :param item: 獲取的屬性名 :return: 獲取到的屬性值 """ print("您要獲取的屬性為:", item) value = super().__getattribute__(item) # 繼承父類 return value def __setattr__(self, key, value): """ 設(shè)置屬性的方法 :param key:屬性名 :param value: 屬性值 :return: """ print("您要設(shè)置的屬性名{},屬性值為:{}".format(key, value)) super().__setattr__(key, value) def __delattr__(self, item): """ 刪除屬性的方法 :param item: 屬性名 :return: """ print("您要刪除的屬性為:", item) super().__delattr__(item) def __getattr__(self, item): """ 獲取屬性,屬性不存在時觸發(fā)的方法 :param item: :return: """ print("獲取的屬性{},不存在".format(item)) return 99 m = MyDemo() print("************************* 屬性設(shè)置 ******************************") # 屬性設(shè)置 # 設(shè)置屬性方式一: m.aa = 999 m.name = 'musen' # 設(shè)置屬性方式二: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')
到此這篇關(guān)于python中的屬性管理機(jī)制的文章就介紹到這了,更多相關(guān)python屬性管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3.6實(shí)現(xiàn)連接mysql或mariadb的方法分析
這篇文章主要介紹了Python3.6實(shí)現(xiàn)連接mysql或mariadb的方法,結(jié)合實(shí)例形式分析了Python3.6針對mysql或mariadb數(shù)據(jù)庫操作的相關(guān)模塊安裝、數(shù)據(jù)庫與表的創(chuàng)建、數(shù)據(jù)庫連接等操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05python使用Pycharm創(chuàng)建一個Django項(xiàng)目
這篇文章主要介紹了python使用Pycharm創(chuàng)建一個Django項(xiàng)目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Python爬蟲爬取博客實(shí)現(xiàn)可視化過程解析
這篇文章主要介紹了Python爬蟲爬取博客實(shí)現(xiàn)可視化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06