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