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

Python:单例模式魔法方法

__init__()和__new__():
__init__():初始化对象,给属性赋值

__new__():object基类提供的内置静态方法,在内存中为对象分配空间,返回对象的引用

重写__new__()一定要写return super(),__new__(cls),否则Python解释器得不到分配空间的对象引用,就不会调用__init__()

一个对象的实例化过程:首先执行__init__(),如果没有写__new__(),默认调用object里面的__new__(),返回一个实例对象,然后再去调用__init__(),给对象进行初始化

class Person(object):
    def __init__(cls,*args,**kwargs):
        print("new")
        return super()
    def __init__(self,name):
        self.name=name
        print("name:",self.name)
pe=Person('lihailu')

单例模式:

可以理解成一个特殊的类,这个类只存在一个对象

弊端:多线程访问时容易引发线程安全问题

class A(object):
    pass
a1=A()
print(a1)
a2=A()
print(a2)

重写__new__()方法:

1.定义一个类属性,初始值为None,用来记录单例对象的引用

2.重写

3.进行判断,如果类属性是None,把__new__()返回的对象引用保存进去

4.返回类属性中记录的对象引用

class Singleton(object):
    obj=None
    def __new__(cls, *args, **kwargs):
        print("new")
        #判断类属性是否为空
        if cls.obj==None:
            cls.obj=super().__new__(cls)
        return cls.obj
    def __init__(self):
        print("init")
s=Singleton()
print("s:",s)
s2=Singleton()
print("s2:",s2)
#单例模式:每一次实例化所创建的对象都是同一个,内存地址都一样

运行结果为:
new
init
s: <__main__.Singleton object at 0x000002952B0B7E00>
new
init
s2: <__main__.Singleton object at 0x000002952B0B7E00>

通过导入模块实现单例模式:

应用场景:回收站对象,音乐播放器,开发游戏软件(场景管理器),数据库配置,数据库连接池的设计

魔法方法:

8.可调用对象:函数/内置函数和类都是可调用对象,凡是可以把一对()应用到某个对象身上都可以称之为可调用对象

callable():判断一个对象是否为可调用对象;

相关文章:

  • 为何AI系统比以往任何时候都更需要红队测试
  • 光流 | 基于KLT算法的人脸检测与跟踪原理及公式,算法改进,matlab代码
  • C++20新特性:std::assume_aligned详解
  • 【GL010】C++
  • 数据结构初阶-二叉树的应用
  • 阿里开源的免费数据集成工具——DataX
  • AI加持后能自动化运维吗?
  • 数据库联表Sql语句(3个表)建一个新表(MySQL,Postgresql,SQL server)2
  • 【全队项目】智能学术海报生成系统PosterGenius(项目介绍)
  • Leetcode 刷题笔记 图论part05
  • 零售CMS革新驱动智慧建站转型
  • 重学Java基础篇—如何优雅的删除HashMap元素
  • 腾讯云DNS和Lego工具结合使用,可以方便地为你的域名自动申请和续期SSL证书。
  • Gone v2 配置管理4:连接Apollo配置中心
  • 智能手持终端PDA在设备巡检管理中的应用
  • 【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”
  • 大数据学习(83)-数仓建模理论
  • InnoDB 引擎核心知识点
  • 【AI】知识蒸馏-简单易懂版
  • C/C++蓝桥杯算法真题打卡(Day9)
  • 王日春已任教育部社会科学司司长,此前系人教社总编辑
  • 习近平抵达莫斯科伏努科沃专机机场发表书面讲话(全文)
  • 4月外汇储备增加410亿美元,黄金储备连续6个月增加
  • 潘功胜:降准0.5个百分点,降低政策利率0.1个百分点
  • 竞彩湃|巴萨客场淘汰国际米兰,巴黎双杀阿森纳
  • 黄道炫:南京102天——黄镇球的防空日记