摘自《流暢的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的記憶...