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

      

  • 相关阅读:
    MySQL常用命令
    Jstack、Jmap命令简单使用
    MySQL慢查询日志ES索引模板
    MySQL二进制安装部署
    varnish启动报错
    基础训练 Sine之舞
    基础训练 FJ的字符串
    基础训练 芯片测试
    基础训练 龟兔赛跑预测
    基础训练 回形取数
  • 原文地址:https://www.cnblogs.com/594504110python/p/9398206.html
Copyright © 2020-2023  润新知