對象是元類的__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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章