zoukankan      html  css  js  c++  java
  • _\_call\_\_

    __call__

    一、__call__

    • 对象后面加括号时,触发执行。
    • 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
    • 先执行父类的__call__,然后在执行自己的__init__方法
    class Foo:
        def __init__(self):
            print('__init__触发了')
    
        def __call__(self, *args, **kwargs):
    
            print('__call__触发了')
    
    
    obj = Foo()  # 执行 __init__
    
    obj()  # 执行 __call__
    
    

    __init__触发了

    __call__

    class Mymeta(type):
        # def __call__(self, *args, **kwargs):
        #     print('进入__call__')
        #     return ty
    
        def __call__(self, *args, **kwargs):
    
    
            """
            因为__call返回的空对象,所以要自己生成对象,通过__new方式)
            :param args:
            :param kwargs:
            :return:
            """
            print("__call__")  
    
            # self ==> Person
            # print(args)
            # print(kwargs)
    
            # return self(*args) # 出现递归
    
            # 实例化产生一个Person类的对象,借助__new__来产生,需要把类传过去,才能产生对象
            self.__new__(self)
            # obj 是Person类的对象,只不过是空的,
            obj = object.__new__(self)  # (因为__call返回的空对象,所以要自己生成对象,通过__new方式)
    
            # obj = self.__new__(self)
    
            # 调用__init__方法完成初始化
            # 类来调用__init__方法, 就是个普通函数,有几个参数就要传几个参数
            # self.__init__(obj, *args, **kwargs)
    
            # 对象来调用__init__方法,对象的绑定方法,会把自身传过去
    
            obj.__init__(*args, **kwargs)
    
            print(obj)
            return obj
    class Person(object, metaclass=Mymeta):
        school = 'hnnu'
    
        def __init__(self, name):
            print('sd')
            self.name = name
    
        def score(self):
            print("分数100")
    
        def __call__(self, *args, **kwargs):
            print('Person 进入__call__')
            return 1
    
    p = Person('randy')
    p.name
    

    __call__
    1
    person__init__
    <__main__.Person object at 0x02CC4210>

  • 相关阅读:
    openlayers跨域设置后出现http status 500错误
    myeclipse 2014 闪退问题解决
    html跨域获取数据
    centos的nginx支持ssl
    Hadoop学习笔记---HDFS
    Nginx Web服务器配置
    用ReentrantLock和Condition实现线程间通信
    Android绘图机制和处理技巧
    自定义ViewPagerIndicator-视图指示器
    Docker学习笔记
  • 原文地址:https://www.cnblogs.com/randysun/p/12252508.html
Copyright © 2011-2022 走看看