__call__方法解釋
官方定義為,將實體化的類變成可呼叫物件,比較難于理解,個人理解為,如果類中定義了__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 <module>
a(4,5)
TypeError: 'apple' object is not callable
上面代碼回傳結果
1
2
3
4
5
6
__call__方法應用
什么是可呼叫物件
callable(obj)方法會回傳引數是否可以被呼叫,可被呼叫回傳True,否則False
- 變數不可被呼叫
- 函式可被呼叫
- 類可被呼叫
- 實體化的類不可被呼叫
- 添加了__call__方法的類實體可被呼叫
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/376848.html
標籤:Python
上一篇:JAVA初階必學-線性表-順序表
下一篇:SpringSecurity
