在类定义中最优先被调用的方法并不是__init__,而是new,__init__方法接受的self(用我自己的理解就是实例化对象的身份证),也不是凭空产生的,而是有一位冲在最前线的侦察兵打探下来的信息经过处理返回给__init__也就是self。
new接受的参数是class,也就是类对象,他源自于他的父亲或者祖先 一脉传承下来的东西,而new只管传宗接代的事,他会调用父类的new来返回self, 把基因传递给新类,一切的类都继承于object基类,在经过new的操作后返回带有实例化id的实例对象信息self 传递给init, 如果接收到了其他参数 new将直接传递给init
还有需要注意的是一般来说 new有返回值 而init不允许有返回值。
class CapStr(str): # 继承系统类str
def __new__(cls, string):
string = string.upper()
return super().__new__(cls, string)
cap = CapStr('hello')
print(cap)
下面的实验会更加理解init 和 new 和 实例对象的关系
class CapStrs(str):
def __new__(cls, string):
self_in_init = super().__new__(cls, string)
print(id(self_in_init))
return self_in_init
def __init__(self, string):
print(id(self))
caps = CapStrs('helloworld')
print(id(caps))
2383825194784
2383825194784
2383825194784
附加:del操作调用的是__del__(self):方法