python描述器的訪問順序

dav2100發表於2021-09-11

python描述器的訪問順序

本文教程操作環境:windows7系統、Python 3.9.1,DELL G3電腦。

1、順序說明

資料描述器 > 例項屬性 > 非資料描述器;例項屬性 > 類屬性。

當存在描述器的時候,一個類例項的查詢屬性順序為:先查詢類或父類中是否有資料描述器屬性,如果有那麼,先訪問資料描述器,如果沒有資料描述器 --> 那麼就會查詢自己例項的dict屬性,如果dict屬性裡面也沒有找到 --> 然後會在類或父類的非資料描述器進行查詢。

2、例項

# 例子二
class A:
    def __init__(self):
        self.x = 1
 
    def __get__(self, instance, owner):
      """
      以下兩個引數都是「必須引數」,約定使用
      instance: 描述器所在類的例項
      owner:呼叫描述器的類
      """
        return self.x
 
    def __set__(self, instance, value):
      """
      以下兩個引數都是「必須引數」,約定使用
      instance: 描述器所在類的例項
      value:用來設定屬性的值
      """
        self.x = value
        
    def __delete__(self, instance):
      """
      以下引數是「必須引數」,約定使用
      instance: 描述器所在類的例項
      """
      pass
 
 
class B:
    def __init__(self):
        self.x = 1
 
    def __get__(self, instance, owner):
        return self.x
 
 
class C:
    a = A()
    b = B()
 
    def __init__(self, a, b):
        self.b = a
        self.b = b

上面在class C中,分別定義了資料描述器和非資料描述器a,b以及同名的例項屬性,進行以下輸出測試,發現例項c只存在例項屬性b,不存在例項屬性a,說明其確實是被資料描述器,即類屬性a給遮蔽了

以上就是python描述器的訪問順序,大家如果怕記憶混淆,可以記得資料訪問器在最前面就行了。對於訪問順序的理解,大家不妨執行例項程式碼測試。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4479/viewspace-2830806/,如需轉載,請註明出處,否則將追究法律責任。

相關文章