__new__() 方法和__init__() 方法的区别
__new__() 方法需要有返回值,__init__() 不需要返回值
实质区别是 new() 需要返回父类或者说超类的 new() 后的结果,init() 返回一个 None, 不需要手动 return
__new__() 方法需要有返回值
__new__() 方法在类和元类中用法的区别
在类中使用__new__() 方法
这里说的类的普通类
class Spider:
i = 0
def __new__(cls, *args, **kwargs):
print('cls.i >', cls.i)
cls.i += 1
return super().__new__(cls, *args, **kwargs)
def __init__(self):
print('self.i >', self.i)
Spider()
Spider()
Spider()
输出如下
cls.i > 0
self.i > 1
cls.i > 1
self.i > 2
cls.i > 2
self.i > 3
在普通类中使用 new 的第一个参数是 cls,而 init 的第一个参数是 self
- cls 表示当前类
- self 表示当前实例
在元类中使用__new__() 方法
元类有如下定义方式
class Single(object):
_instance = None
def __new__(cls, *args, **kw):
if cls._instance is None:
cls._instance = object.__new__(cls, *args, **kw)
return cls._instance
def __init__(self):
pass
single1 = Single()
single2 = Single()
print(id(single1) == id(single2))
输出如下
True