官方定義為,將實例化的類變成可調用對象,比較難于理解,個人理解為,如果類中定義了__call__方法,那么就給該類擴展了一個可調用特性,可以像函數一樣去調用,例如:a=類名() a(參數)等價于a.__call__(參數)
成都創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站設計、網站建設、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的鄉寧網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
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),會報錯
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
上面代碼返回結果
1
2
3
4
5
6
callable(obj)方法會返回參數是否可以被調用,可被調用返回True,否則False
uu = 23
print("變量uu可被調用嗎? ",callable(uu))
def orange():
pass
print("函數orange可被調用嗎? ",callable(orange))
class peach(object):
def __init__(self):
pass
upeach = peach()
print("類peach可被調用嗎? ",callable(peach))
print("類實例upeach可被調用嗎? ",callable(upeach))
fapple = apple(1,2)
print("類實例fapple可被調用嗎? ",callable(fapple))
返回結果
變量uu可被調用嗎? False
函數orange可被調用嗎? True
類peach可被調用嗎? True
類實例upeach可被調用嗎? False
類實例fapple可被調用嗎? True
實例化的類包含屬性和方法,我們如何判斷某個key是屬性還是方法呢?
hasattr(obj,attribute)函數可以檢查類實例中是否存儲某屬性或方法,但是無法判斷是屬性還是方法,我們可以借助__call__來判斷,
實例屬性沒有__call__
實例方法具有__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__'))
返回結果
True
True
False
True
x 是方法嗎? False
get 是方法嗎? True