总结:

python中没有类构造器。

__new__和__init__相配合才是python中真正的类构造器。

__new__ 是创建一个实例,__init__ 是初始化一个实例。

当生成一个实例时,先执行__new__,创建一个实例,再执行__init__来初始化这个实例

一、__init__ 初始化

1、当类的初始化时,类中的方法__init__可以被直接定义,它在实例生成时执行,并且类中的方法与普通函数有很小的区别。

2、一个类中的方法必须包含一个关键字self,也就是instance本身。

这个关键字可以是任意变量名,只是通常使用self。

实例

声明一个类,并为类添加初始化方法。

# 定义类
class MyClass:
# 初始化方法,第一个参数为对象本身 self,第二个参数为实例化时必须传递的参数
def __init__(self, name):
print(name)

# 类的调用,只需要传递 name 参数即可
c = MyClass("橡皮擦")

二、__new__() 创建实例

class CapStr(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))

a = CapStr("I fu Ch!")
print(id(a))

1、__new__方法的第一个参数是这个类,而其余的参数会在调用成功后全部传递给__init__方法初始化

我们比较两个方法的参数,可以发现__new__方法是传入类(cls),而__init__方法传入类的实例化对象(self)。

而有意思的是,__new__方法返回的值就是一个实例化对象(ps:如果__new__方法返回None,则__init__方法不会被执行,并且返回值只能调用父类中的__new__方法,而不能调用毫无关系的类的__new__方法)。

我们可以这么理解它们之间的关系,__new__是开辟疆域的大将军,而__init__是在这片疆域上辛勤劳作的小老百姓,只有__new__执行完后,开辟好疆域后,__init__才能工作,结合到代码,也就是__new__的返回值正是__init__中self。
 

三、__del__ 

1、__del__方法称为析构方法,用于实现对象被销毁所需的操作。Ex:释放对象占用的资源、打开的文件资源、网络连接等。

Python实现自动垃圾回收,当对象未被引用(引用计数为0)时,垃圾回收器调用__del__方法。

2、用del语句删除对象,确保调用系统自动提供的__del__方法,一般不需要自定义析构方法。

实例:

class Person:

def __del__(self):
print("销毁对象:{0}".format(self))

p1 = Person() # 5. 销毁对象:<__main__.Person object at 0x000001DFCD279FC8>
print(id(p1)) # 1. 2060731260872
p2 = Person() # 3. 销毁对象:<__main__.Person object at 0x000001DFCD284088>
print(id(p2)) # 2. 2060731302024
del p2
print("over") # 4. over
# print(id(p2)) # name 'p2' is not defined