描述符意思
描述符(Descriptor)在Python中是一個對象,它提供了一種機制,可以將額外的信息與Python中的基本數據類型(如類、實例、函式等)相關聯。描述符可以控制對這些基本數據類型的屬性的訪問,例如獲取、設定和刪除。
描述符本身是一個類,它定義了如何通過實例屬性來訪問其方法。當一個描述符被用於一個類的屬性時,它會攔截對該屬性(即描述符對象)的訪問。描述符協定定義了三個方法:
__get__()
: 當描述符的屬性被獲取時調用,例如,當使用點運算符obj.attr
時。__set__()
: 當描述符的屬性被設定時調用,例如,當使用賦值obj.attr = value
時。__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
都會被執行。