VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > python入门教程 >
  • python魔术方法__call__的研究

__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

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。



相关教程