首頁 > 軟體

python中的屬性管理機制詳解

2022-06-23 14:01:03

一、私有屬性

  • Python並沒有真正的私有化支援,但可用下劃線得到偽私有,有一項大多數 Python 程式碼都遵循的習慣:帶有下劃線,字首的名稱應被視為非公開的 API 的一部分(無論是函數、 方法還是資料 成員)
  • python中私有並沒有實現真正的私有,只是在儲存屬性的時候改了個名字,在外部無法直接方法

私有屬性具體表現為:

  • _引數名 : 宣告式私有屬性
  • __引數名 : _類名 + 私有屬性名
class Attributes:
    attr = 100
    # 宣告式私有屬性
    _attr2 = 999
    # _類名 + 私有屬性名
    __attr3 = 888
print(Attributes.attr)
print(Attributes._attr2)

雙下劃線的私有屬性,在去呼叫的時候 ,並沒有__attr3 這個屬性名,用 dict 屬性,去檢視屬性字典看下:


可以看到是雙下劃線的私有屬性是:_類名 + 私有屬性名

二、屬性限制-__slots__方法

  1. 定義過slots屬性來限制類範例的屬性,只能繫結slots指定的屬性,不能新增slots之外的屬性
  2. 新增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')

到此這篇關於python中的屬性管理機制的文章就介紹到這了,更多相關python屬性管理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com