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