_\_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>

posted @ 2020-02-02 16:01  RandySun  阅读(173)  评论(0编辑  收藏  举报