2025-08-27?

这啥玩意儿?

我感觉我看了 AI 的讲解,也没有发现在哪里会产生使用 new 的需求

在 Python 中,__new____init__ 都是类的特殊方法(也叫魔术方法),它们在对象创建过程中扮演不同的角色。理解它们的区别对于深入掌握 Python 面向对象编程非常重要。


一、基本职责的区别

方法 作用
__new__ 创建对象(实例化),返回一个实例对象
__init__ 初始化对象,对已创建的对象设置初始状态(属性等)

二、执行顺序

  1. __new__ 先执行:负责创建对象(即分配内存)。
  2. __init__ 后执行:负责初始化对象(设置属性等)。
class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ is called")
        instance = super().__new__(cls)
        print("Object created")
        return instance

    def __init__(self, value):
        print("__init__ is called")
        self.value = value

obj = MyClass(10)

输出:

__new__ is called
Object created
__init__ is called

三、参数传递

  • __new__ 的第一个参数是 cls(类本身),返回一个实例。
  • __init__ 的第一个参数是 self(实例),不返回值(或返回 None)。
def __new__(cls, *args, **kwargs):
    # 创建实例
    return super().__new__(cls)

def __init__(self, value):
    # 初始化实例
    self.value = value

四、返回值的区别

方法 返回值
__new__ 必须返回一个实例对象(通常是 cls 的实例)
__init__ 不应返回值,或只能返回 None,否则会报错

⚠️ 如果 __init__ 返回非 None 值,会引发 TypeError


五、典型使用场景

1. __new__ 的使用场景(较少见,但关键)

  • 不可变对象的初始化(如 int, str, tuple
  • 单例模式(Singleton)
  • 自定义对象创建过程(比如从缓存返回对象)

✅ 示例:实现单例模式

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self):
        # 多次调用 __init__,但 __new__ 只创建一次对象
        print("Initializing singleton")
a = Singleton()
b = Singleton()
print(a is b)  # True

注意:虽然 __init__ 每次都会执行,但 __new__ 控制了对象是否真正创建。

2. __init__ 的使用场景(最常见)

  • 给对象设置初始属性
  • 执行初始化逻辑
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

六、关键总结

对比项 __new__ __init__
作用 创建对象 初始化对象
调用时机 __init__ 之前 __new__ 之后
参数 cls self
返回值 必须返回实例 不应返回值(或返回 None
是否必须 否(一般用默认) 是(常用)
使用频率 低(特殊场景) 高(几乎每个类都有)
可否被覆盖 可以 可以

七、补充说明

  • 如果 __new__ 返回 None,则 __init__ 不会被调用
  • 如果 __new__ 返回的不是当前类的实例,__init__ 也不会被调用(或调用在错误的对象上)。
  • __new__ 是静态方法(但不需要 @staticmethod 装饰),Python 自动处理。
  • __init__ 是实例方法,依赖于 __new__ 返回的实例。

八、一句话总结

__new__ 决定 如何创建对象__init__ 决定 如何初始化对象

你可以把 __new__ 看作“工厂”,负责造出一个空壳对象;__init__ 是“装修工”,负责给这个空壳添加属性和配置。

posted @ 2025-08-25 22:40  没学完四大礼包不改名  阅读(50)  评论(0)    收藏  举报