描述器的表現

2021-09-19 09:24:21 字數 1414 閱讀 9939

class a:

definit(self):

self.a1 = 『a1』

print(『a.init』)

class b:

x = a()

definit(self):

print(『b.init』)

print(』-』*20)

print(b.x.a1)

print(』=』*20)

b = b()

print(b.x.a1)

b.init

a1可以看出執行的先後順序吧?

類載入的時候,類變數需要先生成,而類b的x屬性是類a的例項,所以類a先初始化,所以列印a.init。

然後執行到列印b.x.a1。

然後例項化並初始化b的例項b。

列印b.x.a1,會查詢類屬性b.x,指向a的例項,所以返回a例項的屬性a1的值。

看懂執行流程了,再看下面的程式,對類a做一些改造。

如果在類a中實現get方法,看看變化

class a:

definit(self):

self.a1 = 『a1』

print(『a.init』)

defget(self, instance, owner):

print(「a.get{} {} {}」.format(self, instance, owner))

class b:

x = a()

definit(self):

print(『b.init』)

print(』-』*20)

print(b.x)

#print(b.x.a1) # 拋異常attributeerror: 『nonetype』 object has no attribute 『a1』

print(』=』*20)

b = b()

print(b.x)

#print(b.x.a1) # 拋異常attributeerror: 『nonetype』 object has no attribute 『a1』

b.init

a.get<main.a object at 0x0000000001084e48> <main.b object at 0x0000000001084f28>

none

因為定義了get方法,類a就是乙個描述器,對類b或者類b的例項的x屬性讀取,成為對類a的例項的訪問,

就會呼叫get方法

python描述器 python描述器

首先介紹一下裝飾器,所謂裝飾器,就是接受乙個函式作為引數,然後返回乙個函式的函式。所謂帶引數的裝飾器呢?其實是返回裝飾器的函式。注意啦!python的裝飾器語法是乙個語法糖,實際上並不強制要求你的裝飾器返回函式!你的裝飾器完全返回隨便什麼東西!int float bool str等基本型別,list...

分頻器的VHDL描述

在數位電路中,常需要對較高頻率的時鐘進行分頻操作,得到較低頻率的時鐘訊號。我們知道,在硬體電路設計中時鐘訊號時非常重要的。下面我們介紹分頻器的vhdl描述,在源 中完成對時鐘訊號clk的2分頻,4分頻,8分頻,16分頻。library ieee use ieee.std logic 1164.all...

專案失敗的表現

專案失敗的表現 楊爭 上次的文章中我介紹了專案成功的標準。這篇文章是介紹專案失敗的表現。雖然說成功標準的反面就是失敗,不用再說了什麼了,不過我覺得單獨再說一次的好處是 失敗的東西更有警示性,更容易讓專案經理心裡留下更深的印象,在做專案中時刻警告自己。專案失敗的表現 1 專案延遲發布。專案延遲發布的原...