类的特殊方法"__call__"详解

时间:2023-03-09 23:09:17
类的特殊方法"__call__"详解

1. __call__

  当执行对象名+括号时, 会自动执行类中的"__call__"方法, 怎么用?

class A:
def __init__(self, name):
self.name = name def __call__(self, *args, **kwargs):
print(123) obj = A('WangJianwei')
obj() # 当执行 object() 时,会自动执行类中的"__call__"方法
# 结果: 123

  实例(对象)分为可调用和不可调用, 怎么区分呢?

  单纯的类, 单纯的对象

class A:
def __init__(self, name):
self.name = name # def __call__(self, *args, **kwargs):
# print(123) obj = A('WangJianwei')
# obj()
print(callable(obj)) # 判断给对象是都可被执行
# 结果: False

  

  拥有__call__方法的类

class A:
def __init__(self, name):
self.name = name def __call__(self, *args, **kwargs):
print(123) obj = A('WangJianwei')
obj()
print(callable(obj)) # 判断给对象是都可被执行
# 结果: True

  所以, 当一个类中有"__call__"方法是, 那么这个类产生的对象就是一个可调用对象

   实例一

class Cal:
def __call__(self, a, b):
return a * b obj = Cal()
print(obj(10,20)) #直接使用对象调用__call__, 并执行里面的代码块
# 结果:200

  实例二

class A:
def __call__(self, *args, **kwargs):
print(args)
# 结果: ('123',) class B:
def __init__(self):
self.obj = A()
self.obj('123')
objB = B()