类的特殊方法"__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()

  

posted @ 2018-05-03 20:53  王剑威  阅读(392)  评论(0编辑  收藏  举报