Python魔法方法 单例模式
前言
本文介绍一下python中常用的魔法方法以及面向对象中非常重要的单例模式。
魔法方法
python中一切皆对象,因为python是面向对象的编程语言。python给类和对象提供了大量的内置方法,这些内置方法也称魔法方法。这些魔法方法总是在某种条件下自动触发执行,就像魔法一样。
__init__
方法
该方法是用来接收定义类时类中__new__
方法返回的空对象后为空对象进行初始化的操作,没有返回值。
class Test():def __init__(self, name):self.name = namedef test(self):print(self.name)t = Test('xu')
t1 = Test('python')
__new__
方法
该方法是当类被调用实例化对象时首先被触发的方法,用来实例化一个空对象并返回。
class Test():def __new__(cls,*args, **kwargs):return object.__new__(cls, *args, **kwargs) def __init__(self, name):self.name = name
__call__
方法
如果想让一个对象变成一个可调用对象(加括号可以调用),需要在该对象的类中定义__call__
方法,调用可调用对象的返回值就是__call__
方法的返回值。
class Test():def __init__(self):self.name = 'python'def __call__(self, *args, **kwargs): # self是Test类的对象print(self) # <__main__.Test object at 0x000001C78CE78FD0>print(self.name)t = Test()
t() # python
__str___
方法
当对象被访问打印时触发执行,该方法必须有一个字符串类型的返回值。
class Test():def __init__(self, name):self.name = namedef __str__(self):return self.namet = Test('xu')
print(t1) # xu
__del___
方法
__del__
方法是在对象被删除时自动触发,由于python的垃圾回收机制会自动清理程序中没用的资源,因此如果一个对象只是占用应用程序的资源,没有必要定义__del__
方法,但是如果设计到占用系统资源的话比如打开的文件对象,由于关系到操作系统的资源,python的垃圾回收机制派不上用场的时候,就需要为对象创建__del__
方法,用于对象被删除后自动触发回收操作系统资源。
class Test:def __init__(self):self.x = open('a.txt',mode='w')# self.x = 占用的是操作系统资源def __del__(self):print('run')# 发起系统调用,告诉操作系统回收相关的系统资源self.x.close()obj = T()
del obj # obj.__del__()
__enter__ & __exit__
方法
使用with
上下文管理时,会触发对象中的__enter__
方法,并将__enter__
方法的返回值赋值给as声明的变量。
with语句正常结束的时候会触发__exit__
方法,该方法的三个参数分别代表异常类型、异常值和溯源信息,如果with语句代码块出现异常,则with语句后的代码都不会被执行,但是如果该方法返回值为True
,异常会被清空,with代码块后的代码还会被正常执行。代码如下:
class Open:def __init__(self):self.name = 'open'def __enter__(self):print('with语句执行时会首先执行的方法,返回值会赋值给as声明的变量')return self.namedef __exit__(self, exc_type, exc_val, exc_tb):print('with中的代码块执行完毕时执行exit')print(exc_type, '如果出现异常表示异常类型')print(exc_val, '表示异常的值')print(exc_tb, '表示异常的溯源信息')return 123 # 非零 非空 非None为真with Open() as test:print(test)raise TypeError('看一下错误信息')
print('我会不会被执行呢') # 当__exit__方法返回值为真时,会被执行,否则不会被执行
item
系列方法
item
系列方法包括__setitem__、__getitem__、delitem__
方法,这三种方法分别会在中括号赋值/修改值、中括号取值、中括号删除值时触发,比如可以自定义一个字典类,并自定义中括号赋值、取值、删除值的方法:
class MyDict(dict):def __setitem__(self, key, value):print('执行setitem', key, value) # 执行setitem, x, 1self.__dict__[key] = valuedef __getitem__(self, item):print('执行getitem', item) # 执行getitem xprint(self.__dict__[item]) # 1def __delitem__(self, key):print('执行delitem', key) # 执行delitem xself.__dict__.pop(key)d = MyDict()
d['x'] = 1
print(d['x'])
del d['x']
attr
系列方法
attr
系列方法包括__setattr__,__getattr__,__delattr__
,__setattr__
在添加/修改属性时会触发,___delattr__
删除属性的时候触发,__getattr__
在使用.
调用属性并且属性不存在时触发。如下代码所示
class Test:def __init__(self):self.name = 'python'def __setattr__(self, key, value):print('添加/修改属性setattr')self.__dict__[key] = value# self.key = value # 会出现无线递归,因为对象.属性会调用__setattr__方法def __delattr__(self, item):print('删除属性delattr')self.__dict__.pop(item)def __getattr__(self, item):print('属性不存在时调用getattr')t = Test()
t.x = 'x'
print(t.y)
del t.x
单例模式
单例模式是一种软件设计模式,为了保证一个类无论调用多少次产生的对象都指向同一个内存地址,即仅仅只有一个对象。
实现单例模式的方式有很多,总的原则就是保证一个类只要实例化一个对象,因此关键点就是如何判断这个类是否实例化过一个对象。
这里介绍几种实现方式,供大家参考:
模块导入的方式
这种方式的原理是模块导入后只运行一次,后面再次使用该模块中的类是直接从内存中查找。
# cls_singleton.py
class Foo(object):passinstance = Foo()# test.py
import cls_singletonobj1 = cls_singleton.instance
obj2 = cls_singleton.instance
print(obj1 is obj2) # True
通过__new__
方法
原理就是判断类是否有实力,有就直接返回,没有就保存到_instance
中
class Test:_instance = Nonedef __init__(self, name, age):self.name = nameself.age = agedef __new__(cls, *args, **kwargs):# if cls._instance:# return cls._instance # 有实例则直接返回# else:# cls._instance = super().__new__(cls) # 没有实例则new一个并保存# return cls._instance # 这个返回是给是给init,再实例化一次,也没有关系if not cls._instance: # 这是简化的写法,上面注释的写法更容易提现判断思路cls._instance = super().__new__(cls)return cls._instancet1 = Test('python', 18)
t2 = Test('python1', 18)
print(t1 is t2) # True
自定义元类的方式
这种方式的原理是类调用的过程,类定义时会调用元类下的__init__
,类调用(实例化对象)时会触发元类下的__call__
方法。
class Mymeta(type):def __init__(cls, name, bases, dic):super().__init__(name, bases, dic)cls._instance = None # 将记录类的实例对象的数据属性放在元类中自动定义了def __call__(cls, *args, **kwargs): # 此call会在类被调用(即实例化时触发)if cls._instance: # 判断类有没有实例化对象return cls._instanceelse: # 没有实例化对象时,控制类造空对象并初始化obj = cls.__new__(cls, *args, **kwargs)obj.__init__(*args, **kwargs)cls._instance = obj # 保存对象,下一次再实例化可以直接返回而不用再造对象return objclass Test(metaclass=Mymeta):def __init__(self, name, age):self.name = nameself.age = aget1 = Test('python', 18)
t2 = Test('python1', 18)
print(t1 is t2) # True
相关文章:
Python魔法方法 单例模式
前言 本文介绍一下python中常用的魔法方法以及面向对象中非常重要的单例模式。 魔法方法 python中一切皆对象,因为python是面向对象的编程语言。python给类和对象提供了大量的内置方法,这些内置方法也称魔法方法。这些魔法方法总是在某种条件下自动触…...

计算机网络基础知识(三)—— 什么是OSI七层模型?
文章目录 00 | 🛸发展史🛸01 | 🛸OSI七层参考模型🛸02 | 🛸OSI七层参考模型的信息流向🛸 OSI七层模型是Open Systems Interconnection Reference Model的缩写,是由国际标准化组织(IS…...
Python(符号计算常微分方程)谐振子牛顿运动方程
牛顿运动方程 牛顿运动方程可以写成以下形式 F d p d t m d v d t m d 2 r d t 2 \mathbf{F}\frac{d \mathbf{p}}{d t}m \frac{d \mathbf{v}}{d t}m \frac{d^2 \mathbf{r}}{d t^2} Fdtdpmdtdvmdt2d2r 恒力问题 具有恒定力的问题意味着恒定的加速度。 典型的例子是…...

OpenCL编程指南-1.2OpenCL基本概念
OpenCL概念基础 面向异构平台的应用都必须完成以下步骤: 1)发现构成异构系统的组件。 2)探查这些组件的特征,使软件能够适应不同硬件单元的特定特性。 3)创建将在平台上运行的指令块(内核)。 4)…...

使用 ChatGPT 辅助学习——为自己找一个老师
我们每个人都有许多标签,例如高中生、成绩中等、文科,根据这些标签我和其他拥有相同标签的人分配了相同的教程、班级和老师,这可以带来效率上的提升,因为同一份教程、老师就可以服务几十上百人,而无须为每个人定制&…...
MySQL基础(二十一)用户与权限管理
1. 用户管理 1.1 登录MySQL服务器 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下: mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"-h参数后面接主机名或者主机IP,…...

程序员的下一个风口
面对近一年的裁员潮,以及 GPT 出现带来的 AI 颠覆潮流,各种话题出现:「前端已死」、「后端已死」、「Copy/Paste 程序员将被 AI 取代」。程序员行业是否还有发展空间? 这一两年的就业机会是因为经济衰落周期内造成的,不…...

Android 自定义View 之 简易输入框
简易输入框 前言正文① 构造方法② XML样式③ 测量④ 绘制1. 绘制方框2. 绘制文字 ⑤ 输入1. 键盘布局2. 键盘接口3. 键盘弹窗4. 显示键盘5. 相关API 四、使用自定义View五、源码 前言 在日常工作开发中,我们时长会遇到各种各样的需求,不部分需求是可以通…...

SpringMVC的基础知识
创建SpringMVC项目 SpringMVC项目其实和SpingBoot项目差不多,就多引入了一个SpringWeb项目而已拉 可以看这篇博客,创建的就是一个SpringMVC项目--创建项目の博客 SpringMVC是啥 Spring是啥相信大家都了解 啥是MVC呢?MVC是Model View Controller的缩写 我们分开看这三个词Model…...

OpenPCDet系列 | 4.2 DataAugmentor点云数据增强模块解析
文章目录 DataAugmentor模块解析1. gt_sampling2. random_world_flip3. random_world_rotation4. random_world_scaling5. limit_period DataAugmentor模块解析 在pointpillars算法中,具体的数据增强方法配置是在yaml中的DATA_CONFIG.DATA_AUGMENTOR进行配置&#…...

精准测试之过程与实践 | 京东云技术团队
作者:京东工业 宛煜昕 一、怎样的技术 •百度百科: 精准测试是一套计算机测试辅助分析系统。 精准测试的核心组件包含的软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统…...
类ChatGPT逐行代码解读(1/2):从零实现Transformer、ChatGLM-6B
前言 最近一直在做类ChatGPT项目的部署 微调,关注比较多的是两个:一个LLaMA,一个ChatGLM,会发现有不少模型是基于这两个模型去做微调的,说到微调,那具体怎么微调呢,因此又详细了解了一下微调代…...

车道线检测
前言 目前,车道线检测技术已经相当成熟,主要应用在自动驾驶、智能交通等领域。下面列举一些当下最流行的车道线检测方法: 基于图像处理的车道线检测方法。该方法是通过图像处理技术从摄像头传回的图像中提取车道线信息的一种方法,…...

云渲染靠谱吗,使用云渲染会不会被盗作品?
云渲染靠谱吗、安全吗?如果使用 云渲染会不会被盗作品......Renderbus瑞云渲染作为一个正经的云渲染平台,也时不时会收到这类疑问,首先,瑞云渲染是肯定靠谱的,各位可以放心使用。另外小编也将在本篇教你如何辨别云渲染平台是否安全…...

什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C
什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C FPGA基础知识:FPGA是英文Field-Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器…...

有什么好用的云渲染?
在CG制作流程中,离线渲染一直是必要且耗时的环节。你的场景越复杂,渲染出现问题的可能性就越大,尤其是当你独自工作,没有人给你建议的时候,灯光、模型、场景任何一个环节渲染时出现问题都可能让你焦头烂额,…...

什么是医学影像PACS系统?PACS系统功能有哪些?作用有哪些?对接哪些设备?业务流程是什么?
一、什么是医学影像PACS系统 PACS:为Picture Archive and CommunicationSystem的缩写,是图象归档和通讯系统。PACS系统应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声…...
分布式缓存:什么是它以及为什么需要它?
前言 随着网络的快速发展,分布式应用变得越来越普遍。这种类型的应用程序需要访问多个组件和服务,而这些组件可能分散在不同的物理位置上。在这种情况下,由于网络通信的高延迟和低带宽,性能问题变得尤为明显。为解决这一问题&…...

MySQL基础(二十二)逻辑架构
1.逻辑架构剖析 1.1 第1层:连接层 系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接。 经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。 用户名或密码不对&#…...
《Kubernetes证书篇:使用TLS bootstrapping简化kubelet证书制作》
一、背景 Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。 …...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...