Python语法进阶篇 --- 单例模式、魔法方法

Python语法进阶篇 --- 单例模式、魔法方法

🐹🐹🐹🐹🐹一只正在努力学习计算机技术的小仓鼠🐹🐹🐹🐹🐹



前置补充内容

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

    名称 方法级别 目的 作用
    new() 类 创建对象 1. 在内存中为对象分配空间;2. 返回对象的引用
    init() 实例 实例化对象 定义实例属性
    python 复制代码
    class Test(object):
    def __init__(self):
        print('这是__init__()方法')
    # __new__()是静态方法,形参里有cls,实参就必须传cls
    def __new__(cls, *args, **kwargs):
        print(cls)
        print('我是__new__()方法')
    
        # 重写__new__()一定要返回实例对象的引用,否则Python解释器得不到分配空间的对象引用,就不会调用__init__()方法
        return super().__new__(cls)
    
    te = Test()
    print('te:', te)

单例模式

  • 含义:单例模式是一种常用的软件设计模式,该模式的目的为确保一个类中只能存在一个实例。

  • 应用场景:回收站、音乐播放器、数据库连接池的设计等。

  • 优点:节省内存空间  缺点:多线程访问容易引发线程安全问题

  • 实现方法:重写__new__()函数

    python 复制代码
    class Singleton(object):
    	# 定义一个类属性,初始值为None,用来记录单例对象的引用
    	obj = None
    	# 重写new方法
    	def __new__(cls, *args, **kwargs):
    		# 如果类属性时None,把__new__()返回的对象引用保存进去
    		if cls.obj is None:
    			cls.obj = super().__new__(cls)
    		# 返回类属性中记录的对象引用
    		return cls.obj
    s1 = Singleton()
    print(s1)
    s2 = Singleton()
    print(s2)

魔法方法

  • 含义:在Python中,xxx()的函数叫做魔法方法,特指具有特殊功能的函数。
  1. doc():类的描述信息

    python 复制代码
    class Person(object):
        # 只能使用多行注释,单行注释无效
        """
            人类 - 类的描述信息
        """
        pass
    def sing():
        """
            唱歌
        """
        pass
    print(Person.__doc__)
    print(sing.__doc__)
  2. module():表示当前操作对象所在的模块

  3. class():表示当前操作对象所在的类

    python 复制代码
    # pytest.py
    class A(object):
    def smile(self):
        print('微笑函数')
    # main.py
    import test.pytest
    a = test.pytest.A()
    a.smile()
    print('module: ', a.__module__)
    print('class: ', a.__class__)
  4. str():对象的描述信息

    python 复制代码
    class B(object):
        string = '我是'
        # 如果类中定义了该方法,那么在打印对象时,默认输出该方法的返回值,也就是打印方法中return的数据
        def __str__(self):
            # 必须有返回值,并且一定是字符串类型
            return B.string + "字符串string"
    b= B()
    print(b)
  5. del():析构函数,在程序结束或者删除对象时被调用

  6. call():使一个实例对象成为一个可调用对象   callable()可以判断一个对象是否是可调用对象

    python 复制代码
    class C(object):
        def __call__(self, *args, **kwargs):
            print('这是__call__函数')
    c = C()
    print('可调用?%s' % callable(c))
    # 调用一个可调用的实例对象,其实就是在调用它的__call__()方法
    c()
相关推荐
JWASX24 分钟前
【agent 开发】Agent 智能体
大数据·人工智能·python
智购科技无人售货机工厂店28 分钟前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse
JWASX36 分钟前
【agent 开发】agent 开发学习 - LangChain(2)
python·学习·langchain
kimnoic1 小时前
Python常用标准库模块及查询使用方法
开发语言·python
范中勤1 小时前
Python 与 Java:模块、包、对象、反射核心差异总结
java·python·面试·反射·元类
I Am a robert girl1 小时前
HelixWorld 源码剖析:当世界模型第一次“开口说话”
python·多模态·扩散模型·世界模型·自回归·空间音频·流式推理
棉猴1 小时前
玩游戏学Python6-演员Actor
python·pygame·玩游戏·游戏编程·actor·pgzero
旖旎夜光1 小时前
【LangGraph实战】LangGraph 学习笔记(四):持久化——从线程记忆到跨会话长期记忆
人工智能·笔记·python·学习·ai编程·langgraph
yeflx2 小时前
万向节死锁
python
亿道电子Emdoor2 小时前
【Perforce】Klocwork-kwgcheck图形化界面无法打开如何解决
git·python·github