__call__可以把例項物件用類似函式的形式表示,進一步模糊了函式和物件之間的概念在python中,函式其實是乙個物件:
>>> f =abs
>>> f.__name__
'abs
'>>> f(-123)
123由於 f 可以被呼叫,所以,f 被稱為可呼叫物件。
所有的函式都是可呼叫物件。
乙個類例項也可以變成乙個可呼叫物件,只需要實現乙個特殊方法__call__()。
我們把 person 類變成乙個可呼叫物件:
class
person(object):
def__init__
(self, name, gender):
self.name =name
self.gender =gender
def__call__
(self, friend):
'my name is %s...
' %self.name
'my friend is %s...
' %friend
現在可以對 person 例項直接呼叫:
>>> p = person('
bob', '
male')
>>> p('
tim'
)my name
isbob...
my friend
istim...
單看 p(
'tim
') 你無法確定 p 是乙個函式還是乙個類例項,所以,在python中,函式也是物件,物件和函式的區別並不顯著。
任務改進一下前面定義的斐波那契數列:
class
fib(object):
???**乙個__call__方法,讓呼叫更簡單:
>>> f =fib()
>>> print f(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
classfib(object):
def__init__
(self):
pass
def__call__
(self,num):
a,b = 0,1;
self.l=
for i in
range (num):
a,b= b,a+b
return
self.l
def__str__
(self):
return
str(self.l)
__rept__=__str__
f =fib()
print f(10)
類的特殊方法 call
1.call 當執行物件名 括號時,會自動執行類中的 call 方法,怎麼用?class a def init self,name self.name name def call self,args,kwargs print 123 obj a wangjianwei obj 當執行 object ...
python3 特殊函式 call
call 的本質是將乙個類變成乙個函式 使這個類的例項可以像函式一樣呼叫 例1 class person object def init self,name,gender self.name name self.gender gender def call self,friend print my ...
Python 特殊方法之slots
目錄python中,每個類都會有例項屬性,預設情況下python會使用乙個字典去儲存乙個物件的例項屬性 物件.dict 這樣就會讓這個例項化的物件沒有任何的限制,可以隨意的給物件做任何屬性設定,為了避免這個問題,我們可通過 slots 來限制例項物件的屬性。1 所以slots是如何做到節約記憶體的?...