python中__new__的重写

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-10-21 19:54:01
原创
876人浏览过
__new__用于控制对象创建,优先于__init__执行。1. 它是静态方法,负责创建并返回类实例,需通过super()调用父类__new__。2. 常见应用场景包括实现单例模式、子类化不可变类型(如str、int)、自定义对象创建逻辑。3. 单例模式示例中,通过类属性记录实例状态,确保全局唯一。4. 子类化不可变类型时,必须在__new__中预处理值,因__init__无法修改已创建的不可变对象。5. 注意:必须返回当前类的实例,否则__init__不被执行;多线程下单例需考虑线程安全。掌握__new__有助于理解Python对象创建机制。

python中__new__的重写

在 Python 中,__new__ 是一个特殊方法,用于控制对象的创建过程。它在 __init__ 之前执行,负责返回类的一个实例。大多数情况下我们不需要重写 __new__,但在某些高级场景中,比如实现单例模式、不可变类型子类化或自定义对象创建逻辑时,就需要重写它。

1. __new__ 的基本作用

__new__ 是一个静态方法(但不需要 @staticmethod 装饰),它的职责是创建并返回一个类的实例。Python 在创建对象时会先调用 __new__,然后再调用 __init__ 初始化实例。

基本语法:

def __new__(cls, *args, **kwargs):
    instance = super().__new__(cls)
    return instance
登录后复制

其中:
- cls 是当前类。
- 必须通过 super() 或直接调用父类的 __new__ 来创建实例。
- 返回值必须是一个由该类创建的实例,否则 __init__ 不会被调用。

2. 何时需要重写 __new__

以下几种常见情况需要重写 __new__

  • 实现单例模式:确保一个类只有一个实例。
  • 继承不可变类型:如 str、int、tuple,因为它们的 __init__ 无法修改已创建的值,必须在 __new__ 中处理初始化。
  • 元类编程或 ORM 映射:动态控制对象创建过程。

3. 实际例子:单例模式

通过重写 __new__ 控制实例唯一性:

立即学习Python免费学习笔记(深入)”;

降重鸟
降重鸟

要想效果好,就用降重鸟。AI改写智能降低AIGC率和重复率。

降重鸟 113
查看详情 降重鸟

class Singleton:
    _instance = None
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">def __new__(cls, *args, **kwargs):
    if cls._instance is None:
        cls._instance = super().__new__(cls)
    return cls._instance
登录后复制

测试

a = Singleton() b = Singleton() print(a is b) # 输出 True

这里通过类变量 _instance 记录是否已经创建过实例,若已存在就直接返回,避免重复创建。

4. 子类化不可变类型

比如我们想创建一个自动转大写的字符串类:

class UpperStr(str):
    def __new__(cls, value):
        value = value.upper()
        return super().__new__(cls, value)
<h1>测试</h1><p>s = UpperStr("hello")
print(s)  # 输出 HELLO
登录后复制

因为 str 是不可变类型,不能在 __init__ 中修改值,所以必须在 __new__ 中处理原始数据。

5. 注意事项

  • 不要忘记调用父类的 __new__,否则不会真正创建实例。
  • 返回值必须是 cls 的实例,否则 __init__ 不会执行。
  • 如果 __new__ 返回其他类的实例,__init__ 可能不会被调用。
  • 在多线程环境下实现单例时,要考虑线程安全问题。

基本上就这些。重写 __new__ 属于进阶用法,理解其机制有助于掌握 Python 面向对象的底层逻辑。不复杂但容易忽略细节。

以上就是python中__new__的重写的详细内容,更多请关注php中文网其它相关文章!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号