神奇的描述符(一) 描述符協議的實現

2022-07-12 02:24:09 字數 1626 閱讀 1684

描述符通過描述符協議實現,任何實現或部分實現以下方法的類,都可以作為描述符使用。

def

__get__

(self, instance, owner):

...def__set__

(self, instance, value):

...def__delete__

(self, instance):

....

__get__ 方法接收三個引數:self為描述符例項自身; instance指訪問屬性所屬的例項;owner指描述符例項附加到的類。

__set__方法的前兩個引數於__get__方法相同,第三個引數value為需要賦值的屬性。

__delete__方法的兩個引數與__get__方法的前兩個引數相同。

定義乙個簡單的描述符,和描述符的託管類,進行測試

class

descriptor:

def__init__

(self):

pass

def__get__

(self, instance, owner):

return

self, instance, owner

def__set__

(self, instance, value):

print

(self, instance, value)

def__delete__

(self, instance):

print

(self, instance)

class

classa(object):

descriptor = descriptor()

將classa例項化為物件a,並分別從例項、類層面讀取描述符。

觀察執行結果:當通過例項訪問時,instance為當前描述符託管的例項,而通過類訪問時,instance為none。但是無論通過例項或類訪問,owner都為描述符所屬的類。

#

例項化為物件a

a =classa()

#從例項取值

print

(a.descriptor)

#(<__main__.descriptor object at 0x10c157438>, <__main__.classa object at 0x10c1574a8>, )

#從類取值

print

(classa.descriptor)

#(<__main__.descriptor object at 0x10c157438>, none, )

對描述符的進行賦值,觀察執行結果:可以發現第乙個引數是描述符自身,第二個引數是描述符託管的例項,第三個引數是賦值給描述符的值

#

對描述符進行賦值

a.descriptor = 2

#<__main__.descriptor object at 0x10f0b1518><__main__.classa object at 0x10f0b1588> 2

上面就是基本的描述符協議實現。

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...

標籤描述符

標籤庫描述符 標籤庫描述符檔案是乙個以 tld 結尾的標準xml文件,來記錄標籤庫包含的標籤和屬性 是標籤庫描述符的根元素,包含的12個子元素 1.標籤庫的文字描述 2.指定標籤庫的版本 3.為標籤制定簡短名字 4.定義乙個url用於唯一的表示此標籤庫 a 為自定義標籤提供乙個文字描述 b 為標籤指...