官方定义为,将实例化的类变成可调用对象,比较难于理解,个人理解为,如果类中定义了__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
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