当前位置: 首页 > news >正文

python---__new__函数

文章目录

  • __new__函数的介绍
  • __new__函数的作用
  • __new__函数的重写
    • 1、重写代码示例:
    • 2、错误重写方法1:
    • 3、错误重写方法2:
  • 4. __new__函数 的常见用途
    • 用途 1:实现单例模式 (Singleton)
    • 用途 2:继承不可变类型 (如 int, str, tuple)
    • 用途 3:返回其他类的实例(工厂模式)
  • __new__ 与 __init__ 的区别

__new__函数的介绍

new 是object基类提供的内置静态方法(虽然通常不需要显式地使用 @staticmethod 装饰器)。

__new__函数的作用

总结:它的作用是为一个类创建并返回一个新的实例。
1、在内存中分配对象的空间。
2、返回对象的引用。

__new__函数的重写

如果因为__new__函数重写导致没有正确的返回实例化对象的引用,__init__函数将不被调用。

1、重写代码示例:

注意点:
1、重写时需要调用super,对父类做扩展。
2、需要返回super的返回值,即实例的引用。(博主在这里认为如果不返回实例的引用,会有内存泄漏)

class MyClass:def __new__(cls, *args, **kwargs):print("__new__ is called. Creating instance.")# 最关键的一步:调用父类的 __new__ 来创建实例instance = super().__new__(cls)# 这里可以对 instance 做一些非常早期的操作return instance # 必须返回实例!def __init__(self, value):print("__init__ is called. Initializing instance.")self.value = value# 测试
obj = MyClass(42)
print(obj.value)

输出:

__new__ is called. Creating instance.
__init__ is called. Initializing instance.
42

2、错误重写方法1:

重写__new__方法,直接覆盖。无法成功的实例化对象。

class MyClass:def __new__(cls, *args, **kwargs):print("__new__ is called. Creating instance.")def __init__(self, value):print("__init__ is called. Initializing instance.")self.value = value# 测试
obj = MyClass(42)
print(obj)

输出

__new__ is called. Creating instance.
None

3、错误重写方法2:

调用了父类的__new__创建实例,但是未返回实例的引用。

class MyClass:def __new__(cls, *args, **kwargs):print("__new__ is called. Creating instance.")# 最关键的一步:调用父类的 __new__ 来创建实例super().__new__(cls)def __init__(self, value):print("__init__ is called. Initializing instance.")self.value = value# 测试
obj = MyClass(42)
print(obj)

输出

__new__ is called. Creating instance.
None

4. __new__函数 的常见用途

用途 1:实现单例模式 (Singleton)

单例模式确保一个类只有一个实例。

class Singleton:_instance = None # 类变量,用于保存唯一的实例def __new__(cls, *args, **kwargs):# 如果实例还不存在,就创建一个if not cls._instance:cls._instance = super().__new__(cls)# 如果已经存在,直接返回已有的实例# 注意:每次调用 Singleton(),__init__ 仍然会被重新执行return cls._instancedef __init__(self, name):self.name = name# 测试
s1 = Singleton("First")
s2 = Singleton("Second")print(s1 is s2)  # 输出: True,它们是同一个对象
print(s1.name)    # 输出: "Second" (注意!因为 __init__ 被第二次调用覆盖了)

注意:上面的例子有一个“陷阱”,第二次创建实例时,init 依然会执行并修改了唯一实例的属性。要避免这个问题,需要更复杂的控制。

用途 2:继承不可变类型 (如 int, str, tuple)

不可变类型在 init 里无法被修改,因为对象在 init 被调用前就已经创建好了。所以必须在 new 阶段就修改它们。

class PositiveInteger(int):def __new__(cls, value):# 在创建对象之前,先对值进行加工return super().__new__(cls, abs(value))# 测试
num = PositiveInteger(-5)
print(num)  # 输出: 5 (是一个真正的 int 类型)
print(type(num)) # 输出: <class '__main__.PositiveInteger'>

用途 3:返回其他类的实例(工厂模式)

new 可以决定返回什么对象,不一定是当前类的实例。

class ClassA:passclass ClassB:passclass MyFactory:def __new__(cls, obj_type):if obj_type == 'A':return ClassA()elif obj_type == 'B':return ClassB()else:return None# 测试
obj1 = MyFactory('A')
obj2 = MyFactory('B')print(type(obj1)) # 输出: <class '__main__.ClassA'>
print(type(obj2)) # 输出: <class '__main__.ClassB'>

newinit 的区别

特性newinit
作用创建对象,并返回这个新对象初始化已被创建的对象
调用顺序先调用后调用
参数第一个参数是 cls (类本身)第一个参数是 self (实例本身)
返回值必须返回创建的对象实例(通常是 cls 的实例)不应该返回任何值(返回 None)
本质它是一个静态方法它是一个实例方法

文章转载自:

http://7kNNsCHu.zgztn.cn
http://qI6C2S0F.zgztn.cn
http://4GaNnW6s.zgztn.cn
http://BmNEQRgo.zgztn.cn
http://5pLbJ0OU.zgztn.cn
http://UXj6k2nn.zgztn.cn
http://V6T3D7fK.zgztn.cn
http://kKnk6PsD.zgztn.cn
http://fZ9FSnVX.zgztn.cn
http://IV4mTImG.zgztn.cn
http://Vng3Mhz7.zgztn.cn
http://MdQBy54W.zgztn.cn
http://l3WXEbMk.zgztn.cn
http://MbTm0w0Z.zgztn.cn
http://865wopVv.zgztn.cn
http://cp0Ufp5z.zgztn.cn
http://vxEdKnhh.zgztn.cn
http://NZ1951dT.zgztn.cn
http://uuEVwdgy.zgztn.cn
http://pxr5B5y3.zgztn.cn
http://I7Zi55Et.zgztn.cn
http://jqCMtfXz.zgztn.cn
http://wkzWU9Ht.zgztn.cn
http://wLeNwT4m.zgztn.cn
http://IhzCqm5k.zgztn.cn
http://3OPz7qhd.zgztn.cn
http://Pm0fXOGJ.zgztn.cn
http://y40px2cb.zgztn.cn
http://cxgziQUp.zgztn.cn
http://Bl6cfK2W.zgztn.cn
http://www.dtcms.com/a/381760.html

相关文章:

  • 2025.9.11英语红宝书
  • Oracle体系结构-数据文件(Data Files)
  • 【51单片机单按键控制2个LED循环闪烁】2022-12-7
  • 【报错分析】解决Chrome浏览器HSTS拦截问题的两种方案
  • 【系统架构设计(28)】计算机系统组成详解:从硬件到软件的解析
  • 护城河式编程模式:黑色幽默中的工程生存学
  • Kotlinx.serialization 使用讲解
  • PCA(主成分分析,Principal Component Analysis) 如何实现从多个指标到少量个主成分降维不失真?
  • Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
  • css `lh`单位
  • 中级统计师-统计法规-第九章 坚守统计法律底线
  • Selenium应用中的核心JavaScript操作技巧
  • 说说transformer 中的掩码矩阵以及为什么能掩盖住词语
  • iDEA Lombok 失效 和 slf log 变量失效问题
  • Linux下实现进度条(原理版本和真实版本)
  • 强化学习中重要性采样
  • 数据库备份谁更快?mydumper VS mysqldump 实测对比
  • 企业级VIP+Nginx的网络访问方案
  • MySQL保姆级安装教程
  • 指针(五)后半
  • 贪心算法在GNN邻域采样问题中的深度解析
  • MongoDB简介
  • ego(4)---检测B样条轨迹的障碍物进入点与退出点
  • mysql 与 MongoDB 的分片
  • 大语言模型基石:Transformer
  • 【Flink】窗口
  • 2.3单链表
  • [RK3566][Android13] Android->屏蔽锁屏界面的时钟和日期显示
  • jetson orin super nano(arm linux系统)上读取大恒图像工业相机(型号MER-050-560U3C)教程
  • 关于Gateway configration studio软件配置网关