__call__是乙個很神奇的特性,只要某個型別中有__call__方法,,我們可以把這個型別的物件當作函式來使用。
也許說的比較抽象,舉個例子就會明白。
in [107]: f =absin [108]: f(-10)
out[108]: 10in [109]: dir(f)
out[109]: ['
__call__',
'__class__',
'__delattr__',
'__dir__',
...]
上例中的f物件指向了abs型別,由於f物件中有__call__方法,因此f(-10)實現了對abs(-10)的過載。
ps:由於變數/物件/例項可以指向函式,而函式能夠接受變數,因此可以看出函式可以接受另乙個函式作為引數,所以__call__就實現裝飾器的基礎。
擴充套件部分:返回函式
函式或類一般有返回值,而python中有乙個神奇的特性就是返回函式。
in [134]: %cpastepasting code; enter '--
' alone on the line to stop or use ctrl-d.::
def lazy_sum(*args):
:
defsum():
: ax =0
:
for n in
args:
: ax = ax +n
:
return
ax:
return
sum:--in [135]: f = lazy_sum(1,3,5,7,9)
in [136]: f
out[136]: __main__.lazy_sum..sum>in [137]: f()
out[137]: 25
為什麼返回函式能夠這麼神奇,咱們一**竟。
in [138]: dir(f)out[138]: ['
__annotations__',
'__call__',
'__class__',
... '
__getattribute__',
...
'__setattr__',
]
檢視一下type,真相打敗,原來是因為f裡有__call__的內建方法。
python筆記3高階特性
切片 閱讀 117822 取乙個list或tuple的部分元素是非常常見的操作。比如,乙個list如下 l michael sarah tracy bob jack 取前3個元素,應該怎麼做?笨辦法 l 0 l 1 l 2 michael sarah tracy 之所以是笨辦法是因為擴充套件一下,取...
Python3(高階特性)
1.例題答案 小寫化含有數字的list l2 s.lower for s in l1 if isinstance s,str true l2.insert key,value for key,value in enumerate l1 if isinstance value,int true l2注...
Python3 高階特性
可迭代物件 集合資料型別 list tuple dict set str generator,包括生成器和帶yield的generator function 可以採用collections模組的iterable型別判斷是否是可迭代物件 from collections import iterable...