# __new__ 是调用类时第一个调用的方法;
# 默认调用object基类的__new__方法,只在需要控制对象的创建过程时重写;
# 必须返回实例(创建对象)
class T():
_i = None
def __new__(cls, **args, **kwargs):
if cls._i is None:
cls._i = super().__new__(cls)
return cls._i
def __init__(self):
self.data = []
t1 = T()
t2 = T()
print(t1 is t2) # True 两个实例相同
class F():
def __new__(cls, value):
if isinstance(value, int):
return super().__new__(IntNumber)
elif isinstance(value, float):
return super().__new__(FloatNumber)
raise TypeError("Unsupported type")
class IntNumber():
def __init__(self, value):
self.value = value
class FloatNumber():
def __init__(self, value):
self.value = value
f1 = F(123)
f2 = F(1.23)
print(f1 is f2) # False 根据数据类型不同,实例化的对象不同
# __del__ 析构方法(当对象被垃圾回收时调用的方法)
# 主要用作最后的清理机制,但不要依赖它来进行重要的资源清理(删除对象)
# 一般不需要重写
class MyClass():
def __init__(self, name):
self.name = name
def __del__(self):
print(f"del {self.name}")
C1 = Myclass('test1')
C2 = Myclass('test2')
del C1
print("****分隔符****")
# 执行结果
"""
del test1
****分隔符****
del test2
"""
# 会发现手动执行和最终对象回收时打印了两次