官方定義為,將實(shí)例化的類變成可調(diào)用對象,比較難于理解,個(gè)人理解為,如果類中定義了__call__方法,那么就給該類擴(kuò)展了一個(gè)可調(diào)用特性,可以像函數(shù)一樣去調(diào)用,例如:a=類名() a(參數(shù))等價(jià)于a.__call__(參數(shù))
成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的鄉(xiāng)寧網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
class apple(object):
def __init__(self,x,y):
self.x = x
self.y = y
def __call__(self,x,y):
self.x = x
self.y = y
def get(self,x,y):
self.x = x
self.y = y
a = apple(1,2)
print(a.x)
print(a.y)
a(3,4)
print(a.x)
print(a.y)
a.get(5,6)
print(a.x)
print(a.y)
a(4,5) 等于a.__call__(4,5)
如果沒有定義__call__()方法,而直接使用a(4,5),會報(bào)錯(cuò)
Traceback (most recent call last):
File "D:/flaskLearn/study/magicMethod/wuhf_a.py", line 22, in
a(4,5)
TypeError: 'apple' object is not callable
上面代碼返回結(jié)果
1
2
3
4
5
6
callable(obj)方法會返回參數(shù)是否可以被調(diào)用,可被調(diào)用返回True,否則False
uu = 23
print("變量uu可被調(diào)用嗎? ",callable(uu))
def orange():
pass
print("函數(shù)orange可被調(diào)用嗎? ",callable(orange))
class peach(object):
def __init__(self):
pass
upeach = peach()
print("類peach可被調(diào)用嗎? ",callable(peach))
print("類實(shí)例upeach可被調(diào)用嗎? ",callable(upeach))
fapple = apple(1,2)
print("類實(shí)例fapple可被調(diào)用嗎? ",callable(fapple))
返回結(jié)果
變量uu可被調(diào)用嗎? False
函數(shù)orange可被調(diào)用嗎? True
類peach可被調(diào)用嗎? True
類實(shí)例upeach可被調(diào)用嗎? False
類實(shí)例fapple可被調(diào)用嗎? True
實(shí)例化的類包含屬性和方法,我們?nèi)绾闻袛嗄硞€(gè)key是屬性還是方法呢?
hasattr(obj,attribute)函數(shù)可以檢查類實(shí)例中是否存儲某屬性或方法,但是無法判斷是屬性還是方法,我們可以借助__call__來判斷,
實(shí)例屬性沒有__call__
實(shí)例方法具有__call__
print(hasattr(a,'x'))
print(hasattr(a,'get'))
print(hasattr(a,'set'))
print(hasattr(a,'__call__'))
if hasattr(a,'x'):
print("x 是方法嗎? ", hasattr(a.x,'__call__'))
if hasattr(a,'get'):
print("get 是方法嗎? ",hasattr(a.get,'__call__'))
返回結(jié)果
True
True
False
True
x 是方法嗎? False
get 是方法嗎? True