Python 用__new__方法实现单例的操作
作者:hiudawn 发布时间:2023-05-22 08:22:41
标签:Python,new,单例
介绍
init 方法通常用在初始化一个类实例时候,但其实它不是实例化一个类的时候第一个被调用 的方法。当使用 Student(id, name) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 new 方法。
new方法接受的参数虽然也是和init一样,但init是在类实例创建之后调用,而 new方法正是创建这个类实例的方法。
new为对象分配空间,是内置的静态方法,new在内存中为对象分配了空间也返回了对象的引用,init获得了这个引用才初始化这个实例。
示例
一个非常简单的单例
class A:
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
因为new方法是一个静态方法(也就是在定义的时候就没有cls参数),所以在这里要传入一个cls参数,而且这里的new你改造过了,所以要返回爸爸的new方法。
按造这个方法改造的单例怎么new都是同一个实例,但init仍然会被执行多次,也就是创建了几个对象就调用几次初始化方法。所以还要对init再进行一些判断。
class A:
instance = None
init_flag = False # 初始化标记
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
if A.init_flag:
return
print('执行了初始化方法')
A.init_flag = True
if __name__ == '__main__':
a = A()
b = A()
print(a)
print(b)
输出结果:
执行了初始化方法
<main.A object at 0x00000210E6F09320>
<main.A object at 0x00000210E6F09320>
总结
通过重载new方法,可以比较简单地实现单例,Python还有很多有趣的内置函数,有空可以再研究研究。
补充知识:Python饿汉式和懒汉式单例模式的实现
看代码吧~
# 饿汉式
class Singleton(object):
# 重写创建实例的__new__方法
def __new__(cls):
# 如果类没有实例属性,进行实例化,否则返回实例
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
饿汉式在创建的时候就会生成实例
# 懒汉式
class Singleton(object):
__instance = None
def __init__(self):
if not self.__instance:
print('调用__init__, 实例未创建')
else:
print('调用__init__,实例已经创建过了:', __instance)
@classmethod
def get_instance(cls):
# 调用get_instance类方法的时候才会生成Singleton实例
if not cls.__instance:
cls.__instance = Singleton()
return cls.__instance
来源:https://blog.csdn.net/hiudawn/article/details/80377510
0
投稿
猜你喜欢
- 前言最近已经播完第一季的电视剧《雪中悍刀行》,从播放量就可以看出观众对于这部剧的期待,总播放量达到50亿,可让人遗憾的是,豆瓣评分只有5.7
- 本篇阅读的代码实现了将输入的数字转化成一个列表,输入数字中的每一位按照从左到右的顺序成为列表中的一项。本篇阅读的代码片段来自于30-seco
- ThinkPHP CURD方法的limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。并且
- pandas DataFrame是二维的,所以,它既有列索引,又有行索引上一篇里只介绍了列索引:import pandas as pddf
- Python是很好的爬虫工具不用再说了,它可以满足我们爬取网络内容的需求,那最简单的爬取网络上的图片,可以通过很简单的方法实现。只需导入正则
- 代码如下:Dim strName, iLoop For Each strName 
- 解决安装Office2003 SP2后不能打开Access的问题手动更改注册表要解决此问题, 手动更改计算机上注册表位置启动 Access
- 我发布了一个通过FTP自动优化新图像的教程。这次我们将抓取整个网站,并在本地优化我们遇到的图像,按URL组织。请注意,这个简短但中级的脚本不
- Python3标准库操作系统接口os模块提供了不少与操作系统相关联的函数。>>> import os>>>
- 1.函数对象前面我们学习了关于Python中的变量类型,例如int、str、bool、list等等…&hell
- 一.使用DOM生成和读取XML文件 实例一: <?php //Creates XML string and XML document
- 本文实例讲述了Python字符串的全排列算法。分享给大家供大家参考,具体如下:题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列
- 当数据量猛增的时候,大家都会选择库表散列等等方式去优化数据读写速度。笔者做了一个简单的尝试,1亿条数据,分100张表。具体实现过程如下。首先
- 最近在工作中涉及到判断服务器所在ip反馈程序使用情况的程序主要要求就是,本机或局域网调试程序时,不反馈其域名(localhost)或ip站长
- IE的特殊性 IE的DOM元素属性与Firefox, Opera, Safari有些不同。在IE中,我们可以给DOM添加任意自定
- 起步在我的印象中,python的机制会自动清理已经完成任务的子进程的。通过网友的提问,还真看到了僵尸进程。import multiproce
- HTTP、HTTPS协议下session共享解决cookie失效 的办法:(也许不是最好的,但是实用)原理就是把session id设置到本
- 本文实例讲述了django框架实现模板中获取request 的各种信息。分享给大家供大家参考,具体如下:在做网页程序时,request,re
- 目录楔子faker使用方法基本使用地理信息类基础信息类计算机基础、Internet信息类网络基础信息类浏览器信息类数字类文本、加密类时间信息
- 经典鼠标控制左右滚动,图片间隔无缝滚动,悬停滚动,图片控制左右滚动JavaScript代码<!DOCTYPE html PUBLIC