对象是元类的__call__生成的

"""
类调用__call__相当于类实例传入参数,元类也是如此
即:
type()(*args, **kwargs) == type.__call__(*args, **kwargs)

类是通过元类的__new__生成
对象是通过类的__new__生成,类的__new__会被元类的__call__调用
所以,对象是通过元类的__call__调用类的__new__生成的

结论:
给元类传入参数,会得到类(调用__new__)
给元类的对象传入参数,会得到类的对象(调用__call__)
"""


class Singleton(type):
    _inst = {}

    def __new__(*mcs, **kwargs):
        print(1)
        return type.__new__(*mcs, **kwargs)

    def __call__(self, *args, **kwargs):
        print(2)
        if self not in self._inst:
            print(3)
            # cls._inst[cls] = type.__call__(self, *(1, 2, 3), **kwargs)
            self._inst[self] = super(Singleton, self).__call__(*(1, 2, 3), **kwargs)
            print(4)
        return self._inst[self], 'lalalala'


class MyClass(object, metaclass=Singleton):
    def __new__(cls, *args, **kwargs):
        print(args)
        print(5)
        return super(MyClass, cls).__new__(cls)
        # return object.__new__(cls)


print('a')
c, a = MyClass()
print(a)
print('b')
b = MyClass()
print(id(a) == id(b))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章