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

《Python 对象创建的秘密:从 __new__ 到单例模式的实战演绎》

《Python 对象创建的秘密:从 new 到单例模式的实战演绎》

一、引言:对象是如何“诞生”的?

在 Python 的世界里,我们习惯于使用 __init__ 来初始化对象,却常常忽略一个更底层的魔法方法——__new__。它是对象真正的“创世者”,负责在内存中创建实例,而 __init__ 则是“装饰者”,负责填充属性与行为。

这篇文章将带你深入理解 __new____init__ 的分工与协作,并通过经典的单例模式(Singleton)实战案例,展示如何用 __new__ 精准控制对象的创建过程。


二、背景介绍:Python 的对象模型与魔法方法

Python 是一门高度面向对象的语言,几乎所有东西都是对象。每当你创建一个类的实例时,Python 会先调用 __new__ 方法创建对象,再调用 __init__ 方法进行初始化。

这种双阶段机制赋予了开发者极大的灵活性,尤其在需要控制对象创建行为的场景中(如缓存、单例、元类等),__new__ 成为不可或缺的利器。


三、基础知识:__new____init__ 的区别与联系

__new__ 的职责:

  • 是一个静态方法(通常定义为 def __new__(cls, ...))。
  • 接收类对象 cls,返回一个实例。
  • 是对象创建的起点,决定是否创建新对象。

__init__ 的职责:

  • 是一个实例方法(定义为 def __init__(self, ...))。
  • 接收已创建好的实例 self,进行属性赋值与初始化。
  • 不返回值,仅用于配置对象状态。

调用流程图:

类名(...) → __new__(cls, ...) → 创建对象 → __init__(self, ...) → 初始化对象

四、实战案例:用 __new__ 实现单例模式

单例模式是一种常见的设计模式,确保一个类只有一个实例,并提供全局访问点。

为什么用 __new__

因为我们要控制“是否创建新对象”,这正是 __new__ 的职责。__init__ 无法阻止对象的创建,只能在对象创建后进行初始化。


示例代码:单例模式实现

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if

文章转载自:

http://5fHH57vg.ndpwg.cn
http://CuvLmwvp.ndpwg.cn
http://vRwW0jm6.ndpwg.cn
http://s89GbkpJ.ndpwg.cn
http://6zJbeQIc.ndpwg.cn
http://C888vTCK.ndpwg.cn
http://zN5DU1ec.ndpwg.cn
http://pphCGkdn.ndpwg.cn
http://33XG7toK.ndpwg.cn
http://yusPf2fP.ndpwg.cn
http://83uMFt46.ndpwg.cn
http://4oC3CRkA.ndpwg.cn
http://sEPbo2FF.ndpwg.cn
http://91aXl4Cr.ndpwg.cn
http://Ou1X81uC.ndpwg.cn
http://U0pk3uNy.ndpwg.cn
http://Ri3iDagI.ndpwg.cn
http://CVngi3xd.ndpwg.cn
http://Pb9dhJY3.ndpwg.cn
http://3P2sfLCY.ndpwg.cn
http://aXYYwLT3.ndpwg.cn
http://FFhe7P5D.ndpwg.cn
http://JKEiJjdr.ndpwg.cn
http://2B58i3UK.ndpwg.cn
http://481PN8zg.ndpwg.cn
http://mPOHc0oQ.ndpwg.cn
http://ON1AKsP4.ndpwg.cn
http://PliO7mFE.ndpwg.cn
http://lzuQREN4.ndpwg.cn
http://Owj8s9vl.ndpwg.cn
http://www.dtcms.com/a/387371.html

相关文章:

  • k8s 与 docker 的相同点和区别是什么?
  • Linux《线程(下)》
  • 第二部分:VTK核心类详解(第20章 vtkCamera相机类)
  • 线性回归与 Softmax 回归:深度学习入门核心模型解析
  • K8s配置管理:ConfigMap与Secret核心区别
  • 【Qt开发】显示类控件(四)-> QCalendarWidget
  • 【K8S系列】Kubernetes 调度与资源管理深度剖析:Requests、Limits、QoS 与 OOM
  • 小程序地图以及讲解的使用
  • 单分类线性逻辑回归
  • 使用POSTMAN 创建泛微OA流程
  • vscode中配置pytest
  • 液氮低温恒温器的应用领域
  • [Yolo遇到的问题] 使用VScode进行ultralytics训练 启动后在scanning阶段意外中断 导致训练无法正常启动
  • 微算法科技(NASDAQ:MLGO)研究分布式量子计算,释放量子计算潜能
  • 使用EasyExcel读不到数据的低级问题
  • 万象EXCEL开发(一)表头标尺搭建—东方仙盟筑基期
  • Redis 发展趋势与 Redis 7.x 新特性:从缓存到实时数据平台的演进
  • 微信小程序 tabBar 切换实现
  • 微信小程序的跳转方式
  • 微信小程序---暮之沧蓝音乐小程序
  • springboot jar包部署到服务器上后,logback按日期归档不正确,今天的日志归档到昨天了,日志中的时间也不正确
  • Spring Boot Logback 日志配置详解:从基础到分布式追踪
  • 辉视养老方案:重塑老年生活的温馨与安心
  • 通过商业智能(BI)可视化数据分析了解布洛芬的产销情况
  • 健康大数据专业能转行做医疗数据分析吗?
  • antiword为什么在ubuntu22.04上面不乱码,而在mac上出现乱码
  • Paperless-ngx v2.18.4在Ubuntu 24.04上的完整离线安装步骤(非Docker)
  • Ubuntu 18.04 搭建 Kubernetes 1.27.4 集群全流程(附问题排查)
  • Ubuntu 18.04 LTS 安装 6.10.10 内核
  • Windows 11 下使用 WSL2 安装 Ubuntu 22.04 步骤