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