__call__方法解释官方定义为,将实例化的类变成可调用对象,比较难于理解,个人理解为,如果类中定义了__call__方法,那么就给该类扩展了一个可调用特性,可以像函数一样去调用,例如:a=类名() a(参数)等价于a.__call__(参数)
class apple(object):def __init__(self,x,y):self.x = xself.y = ydef __call__(self,x,y):self.x = xself.y = ydef get(self,x,y):self.x = xself.y = ya = 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上面代码返回结果
123456__call__方法应用什么是可调用对象callable(obj)方法会返回参数是否可以被调用,可被调用返回True,否则False
- 变量不可被调用
- 函数可被调用
- 类可被调用
- 实例化的类不可被调用
- 添加了__call__方法的类实例可被调用
uu = 23print("变量uu可被调用吗? ",callable(uu))def orange():passprint("函数orange可被调用吗? ",callable(orange))class peach(object):def __init__(self):passupeach = 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__'))返回结果【Python魔术公式实现 python魔术方法__call__的研究】
TrueTrueFalseTruex 是方法吗?Falseget 是方法吗?True
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
