zoukankan      html  css  js  c++  java
  • 类的特殊方法"__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()
    

      

  • 相关阅读:
    正则表达式
    什么是面向对象
    关于jdk,jre,jvm和eclipse的一些总结
    分析ajax爬取今日头条街拍美图
    pycharm误删恢复方法及python扩展包下载地址
    django 之 视图层、模板层
    django
    django框架基础二
    jdango框架基础一
    安装软件,提高速度,可以使用清华源
  • 原文地址:https://www.cnblogs.com/594504110python/p/9398206.html
Copyright © 2011-2022 走看看