描述符意思

描述符(Descriptor)在Python中是一個對象,它提供了一種機制,可以將額外的信息與Python中的基本數據類型(如類、實例、函式等)相關聯。描述符可以控制對這些基本數據類型的屬性的訪問,例如獲取、設定和刪除。

描述符本身是一個類,它定義了如何通過實例屬性來訪問其方法。當一個描述符被用於一個類的屬性時,它會攔截對該屬性(即描述符對象)的訪問。描述符協定定義了三個方法:

  1. __get__(): 當描述符的屬性被獲取時調用,例如,當使用點運算符 obj.attr 時。
  2. __set__(): 當描述符的屬性被設定時調用,例如,當使用賦值 obj.attr = value 時。
  3. __delete__(): 當試圖刪除描述符的屬性時調用,例如,當使用 del obj.attr 時。

描述符的一個常見用途是實現具有延遲計算或依賴於上下文信息的屬性。例如,property 裝飾器就是一個描述符,它允許將getter、setter和deleter方法作為屬性來定義。

下面是一個簡單的描述符類示例:

class ExpensiveOperationDescriptor:
    def __init__(self, instance):
        self.instance = instance

    def __get__(self, instance, owner):
        if instance is None:
            return self
        result = expensive_operation(self.instance)
        return result

class HasDescriptor:
    def __init__(self, name):
        self.name = name
        self.descriptor = ExpensiveOperationDescriptor(self)

    @property
    def descriptor_attr(self):
        return self.descriptor

h = HasDescriptor('John')
print(h.descriptor_attr)  # 輸出 ExpensiveOperationDescriptor(John)

在這個例子中,ExpensiveOperationDescriptor 是一個描述符,它定義了一個昂貴的操作(expensive_operation),這個操作在屬性被獲取時(即 __get__ 方法被調用時)執行。HasDescriptor 類使用 ExpensiveOperationDescriptor 作為它的 descriptor_attr 屬性,因此每次訪問 h.descriptor_attr 時,expensive_operation 都會被執行。