__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.cnblogs.com/wuhuafeng/p/15665344.html
图文来源于网络,如有侵权请联系删除。