__new__是一个静态方法, 而__init__是一个实例方法.
__new__方法会返回一个创建的实例, 而__init__什么都不返回.
只有在__new__返回一个 cls 的实例时后面的__init__才能被调用, 并且__init__方法的属性是__new__返回的实例
4. 当创建一个新实例时调用__new__, 初始化一个实例时用__init__.
单例类
- class Singleton(object):
- def __new__(cls, *args, **kwargs):
- # 如果没有_instance 就创建一个, 有的话直接返回
- if not hasattr(cls,'_instance'):
- # __new__已经被重写, 所以只能执行父类的__new__
- cls._instance=object.__new__(cls,*args,*kwargs)
- return cls._instance
- class MyClass(Singleton):
- a=1
- one=MyClass()
- two=MyClass()
- # one 和 two 完全相同, 可以用 id(),==,is 检查
- print(one.a) # 1
- print(two.a)
- print(id(one)) # 2565285375728
- print(id(two)) # 2565285375728
- print(one == two) # True
- print(one is two) # True
来源: http://www.bubuko.com/infodetail-2871576.html