python描述子的作用:代理一個類別的屬性,讓程式設計師在引用一個物件屬性時自訂要完成的工作;它是實現大部分Python類別特性中最底層的資料結構的實現手段,是使用到裝飾器或元類別的大型框架中的一個非常重要組件。
本文主要介紹描述符的定義,個人的一些理解。希望看完這篇文章後,你對描述詞有了更清楚的認知。
什麼是描述符
官方的定義:描述符是一種具有「捆綁行為」的物件屬性。當存取(取得、設定和刪除)它的屬性時,實際上是呼叫特殊的方法(_get_(),_set_(),_delete_())。也就是說,如果一個物件定義了這三種方法的任何一種,它就是一個描述符。
描述子的作用是用來代理一個類別的屬性,需要注意的是描述子不能定義在被使用類別的建構子中,只能定義為類別的屬性,它只屬於類別的,不屬於實例,我們可以透過查看實例和類別的字典來確認這一點。
描述子是實現大部分Python類別特性中最底層的資料結構的實作手段,我們常使用的@classmethod、@staticmethd、@property、甚至是__slots__等屬性都是透過描述符來實現的。它是許多高階程式庫和框架的重要工具之一,是使用到裝飾器或元類別的大型框架中的一個非常重要元件。註:裝飾器和元類別等概念我們在以後文章中說明。
如下範例一個描述符及引用描述符類別的程式碼:
class Descriptors: def __init__(self, key, value_type): self.key = key self.value_type = value_type def __get__(self, instance, owner): print("执行Descriptors的get") return instance.__dict__[self.key] def __set__(self, instance, value): print("执行Descriptors的set") if not isinstance(value, self.value_type): raise TypeError("参数%s必须为%s"%(self.key, self.value_type)) instance.__dict__[self.key] = value def __delete__(self, instance): print("执行Descriptors的delete") instance.__dict__.pop(self.key) class Person: name = Descriptors("name", str) age = Descriptors("age", int) def __init__(self, name, age): self.name = name self.age = age person = Person("xiaoming", 15) print(person.__dict__) person.name person.name = "jone" print(person.__dict__)
其中,Descriptors類別就是一個描述符,Person是使用描述符的類別。
類別的__dict__屬性是類別的一個內建屬性,類別的靜態函數、類別函數、普通函數、全域變數、一些內建的屬性都是放在類別__dict__裡。
在輸出描述子的變數時,會呼叫描述子中的__get__方法,在設定描述子變數時,會呼叫描述子中的__set__方法。
如上範例的運行結果如下:
#以上是python描述符有什麼作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!