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():判断一个对象是否为可调用对象;

相关推荐
Ulyanov1 小时前
雷达导引头Python仿真框架:GPU加速、6-DOF模型与半实物仿真接口
开发语言·python·雷达信号处理·雷达导引头
列逍2 小时前
博客系统测试
自动化测试·python·性能测试
星云开发2 小时前
拒绝无效加班!用Python打造自动化办公流,附Word/PDF互转硬核代码
python
dream_home84073 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
AIGS0013 小时前
跨越语义鸿沟:企业本体语义平台的构建与落地
java·人工智能·python·机器学习·人工智能ai大模型应用
李可以量化3 小时前
PTrade 量化策略实战:二八轮动策略深度解析(下)
python
Mx_coder3 小时前
8年Java开发者AI转型第二周:RAG检索优化-从60%到90%准确率的3个关键技巧 (Day 13-14)
人工智能·python
自动化和Linux3 小时前
【pytest在pycharm中运行与CMD命令运行区别一】
python·pycharm·pytest
大鱼>4 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
Li Ming&4 小时前
Python办公自动化:利用Python批量将PDF转换为图片文件
python·pdf·pip