2019 5 7 可以休息嗎? 函式內省

2021-09-24 08:23:40 字數 2300 閱讀 1329

摘自《流暢的python》

除了__doc__屬性外,函式物件還有很多屬性。使用dir函式可以探知之前的函式物件factorial具有如下屬性:

>>> dir(factorial)

['__annotations__', '__call__', '__class__','__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__','__kwdefault__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__','__repr__', '__setattr__', '__sizeof__', '__str__','__subclasshook__']

>>>

複製**

其中大多數屬性是python物件共有的,本節討論與把函式視作物件相關的幾個屬性,先從__dict__開始。

與使用者定義的常規類一樣,函式使用__dict__屬性儲存於它的使用者屬性。這相當於一種基本的註解。一般來說,為函式隨意賦予屬性不是很常見的做法,但是django框架這麼做了。在django文件中舉了下述示例,把short_description屬性賦予乙個方法,django管理後台使用這個方法時,在記錄列表中會出現指定的描述文字:

def

upper_case_name

(obj):

return ("%s %s" % (obj.first_name, obj.last_name)).upper()

upper_case_name.short_descrption = 'customer name'

複製**

下面重點說明函式專有而使用者定義的一般物件沒有的屬性。計算兩個屬性集合的差集便能得到函式專有屬相列表:

>>> 

class

c:pass

# 建立乙個空的使用者定義的類

>>> obj = c() # 建立乙個例項

>>>

deffunc

():pass

# 建立乙個空函式

>>>

# 計算差集然後排序,得到類的例項沒有而函式有的屬性列表

>>> sorted(set(dir(func)), set(dir(obj)))

['__annotation__', '__call__', '__closure__', '__code__', '__defaults__', '__get__','__globals__', '__kwdefaults__', '__name__', '__qualname__']

複製**

下表為使用者定義的函式的屬性:

名稱型別

說明__annotations__

dict

引數和返回值的註解

__call__

實現**()**運算子,即可呼叫物件協議

__closure__

tuple

函式閉包,即自由變數的繫結(通常是none)

__code__

code

編譯成位元組碼的函式元資料和函式定義體

__defaults__

tuple

形式引數的預設值

__get__

實現唯讀描述符協議

__globals__

dict

函式所在模組的全域性變數

__kwdefaults__

dict

僅限關鍵字形式引數的預設值

__name__

str函式名稱

__qualname__

str函式的限定名稱,如random.choice

之後會討論__defaults__、__code__和__annotation__屬性,ide和框架使用它們提取關於函式簽名的資訊。但是,為了深入了解這些屬性,我們要先討論python為宣告函式形參和傳入實參所提供的強大句法!

建構函式可以為虛函式嗎?

答案當然是否定的,主要從一下兩個角度加以說明。從儲存空間角度 虛函式對應乙個vtable,可是這個vtable其實是儲存在物件的記憶體空間的。那麼問題來了,如果建構函式是虛函式,就要通過vtable來呼叫,可是物件空間還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函...

void函式可以return嗎 自創函式

1 自創函式 自定義函式的一般形式 資料型別說明 函式名稱 引數 預設型別為int,自定義函式盡量放在main函式之前,如果需要放在main函式之後,就要先在main函式之前做宣告。宣告格式 資料型別說明 函式名稱 引數 自定義函式的時候,需要用到函式呼叫。函式呼叫的格式為 函式名 引數 在函式中不...

send函式可以直接傳送結構體嗎?

網路通訊程式設計中,常常用結構體對待傳送的資料進行封裝。比如,struct msg cmd表示命令,遠端會根據cmd進行不同的處理 extradata是要傳送的陣列 len則表示extradata的占用的記憶體位元組數。在這種設計下,當需要傳送資料時,把根據資料長度增加整個struct msg的記憶...