python基礎教程 call

2022-10-10 00:45:16 字數 1343 閱讀 9670

__call__可以使得方法變成可被呼叫物件;(ps:python中的方法和普通函式有點區別:方法的第乙個引數是類例項)

允許乙個類的例項像函式一樣被呼叫。實質上說,這意味著 x() 與 x.call() 是相同的。注意__call__引數可變。這意味著你可以定義__call__為其他你想要的函式,無論有多少個引數。

class entity:

'''呼叫實體來改變實體的位置'''

def _init_(self,size,x,y):

self.x,self.y = x,y

self.size = size

def _call_(self,x,y):

'''改變實體的位置'''

self.x, self.y = x,y

e = entity(1,2,3)#建立例項

e(4,5)#例項可以像函式那樣執行,並傳入x y值,修改物件的x y

例項物件也可以像函式一樣作為可呼叫物件來用,那麼,這個特點在什麼場景用得上呢?

這個要結合類的特性來說,類可以記錄資料(屬性),而函式不行(閉包某種意義上也可行),利用這種特性可以實現基於類的裝飾器,在類裡面記錄狀態,比如,下面這個例子用於記錄函式被呼叫的次數:

class counter:

def _init_(self,func):

self.func = func

self.count = 0

def _call_(self,*args,**kwargs):

self.count += 1

return self.func(*args,**kwargs)

@counter

def foo():

pass

for i in range(10):

foo()

print(foo.count) #10

python大型免費公開課,適合初學者入門

點選此處**免費獲取學習資料及必備軟體。

首先這裡的@counter是裝飾器,執行起來順序是 foo = counter(foo),例項化,把foo函式傳到類counter裡面,並存到物件屬性裡面,然後返回foo = counter例項。

這時foo已經是counter例項,而不是本身foo函式。

ps:__call__這種用法在pytorch中也有所體現,pytorch中自定義的類繼承於nn.module父類,且該子類中對父類的forward方法進行了過載,且父類nn.module中的__call__中呼叫了forward方法,所以我們直接用子類的例項作為可呼叫物件

python基礎教程

乙個簡單的客戶機 import socket s socket.socket host socket.gethostname port 1234 s.bind host,port s.listen 5 while true c,addr s.accept print got connection f...

Python基礎教程

本教程不包括python的安裝,ide採用spyder pytho2.7 1.print pow 2,3 8 print 2 3 8這裡pow函式表示乘方,與 功能相同。2.abs 10 10abs函式用來求乙個數的絕對值。3.round 0.6 1.0 round 0.4 0.0round函式將浮...

Python 基礎教程

python由guido van rossum於1989年底發明,第乙個公開發行版發行於1991年。像perl語言一樣,python 源 同樣遵循 gpl gnu general public license 協議。本教程主要針對python 2.x版本的學習,如果你使用的是python 3.x版本...