Python 中__new__ 和 __init__ 辨析

在 Python 中,__new____init__ 是两个与对象创建和初始化相关的重要方法,但它们的作用和调用时机完全不同。以下是它们的详细区别:

1. __new__ 方法

作用

  • __new__ 是一个静态方法(尽管不需要显式声明为 @staticmethod),负责创建对象实例
  • 它是类实例化时第一个被调用的方法,用于控制对象的创建过程。

调用时机

  • 在类实例化时,__new__ 会被调用,并返回一个新的实例对象。
  • 如果 __new__ 返回一个实例对象,Python 才会调用 __init__ 方法。

参数

  • __new__ 的第一个参数是类本身(cls),而不是实例对象。
  • 其他参数与实例化时传递的参数一致。

返回值

  • 必须返回一个实例对象(通常是 cls 的实例)。
  • 如果返回 None 或其他非实例对象,__init__ 不会被调用。

示例

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("__new__ is called")
        instance = super().__new__(cls)  # 调用父类的 __new__ 方法创建实例
        return instance

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

obj = MyClass(10)

输出

__new__ is called
__init__ is called

2. __init__ 方法

作用

  • __init__ 是一个实例方法,负责初始化对象实例
  • 它用于设置对象的初始状态或属性。

调用时机

  • __new__ 方法返回一个实例对象后,__init__ 会被调用。
  • 如果 __new__ 没有返回实例对象,__init__ 不会被调用。

参数

  • __init__ 的第一个参数是实例对象(self)。
  • 其他参数与实例化时传递的参数一致。

返回值

  • __init__ 不应该返回任何值(返回 None),否则会引发 TypeError

示例

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

obj = MyClass(10)
print(obj.value)

输出

__init__ is called
10

3. __new____init__ 的区别总结

作用

创建对象实例

初始化对象实例

调用时机

在实例化时第一个被调用

__new__

返回实例后被调用

第一个参数

类(

cls

实例对象(

self

返回值

必须返回一个实例对象

不应该返回任何值(返回

None

是否必须实现

通常不需要重写,除非需要自定义创建逻辑

通常需要实现以初始化对象

常见用途

单例模式、不可变对象、自定义实例创建

设置对象的初始状态或属性

4. 使用场景

__new__ 的使用场景

  1. 单例模式:通过 __new__ 控制实例的创建,确保一个类只有一个实例。
  2. 不可变对象:在创建不可变对象时,可以在 __new__ 中修改实例的属性。
  3. 自定义实例创建:控制实例的创建过程,例如返回子类的实例。

__init__ 的使用场景

  • 用于初始化对象的属性或状态。
  • 例如,设置对象的初始值、绑定事件处理器等。

5. 注意事项

  1. __new__ 和 __init__ 的协作:__new__ 负责创建对象,__init__ 负责初始化对象。如果 __new__ 没有返回实例对象,__init__ 不会被调用。
  2. 避免在 __new__ 中初始化属性:虽然可以在 __new__ 中设置属性,但通常建议将初始化逻辑放在 __init__ 中。
  3. 单例模式的线程安全:在多线程环境下,单例模式的实现需要考虑线程安全问题。

通过理解 __new____init__ 的区别,可以更好地控制对象的创建和初始化过程,编写出更灵活和高效的代码。

进阶高级测试工程师 文章被收录于专栏

《高级软件测试工程师》专栏旨在为测试领域的从业者提供深入的知识和实践指导,帮助大家从基础的测试技能迈向高级测试专家的行列。 在本专栏中,主要涵盖的内容: 1. 如何设计和实施高效的测试策略; 2. 掌握自动化测试、性能测试和安全测试的核心技术; 3. 深入理解测试驱动开发(TDD)和行为驱动开发(BDD)的实践方法; 4. 测试团队的管理和协作能力。 ——For.Heart

全部评论

相关推荐

Rena1ssance_:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务