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()
相关推荐
D_jing201 天前
Vue 3 + Element Plus 重置el-drawer样式失效
前端·javascript·vue.js
MY_TEUCK1 天前
【2026最新Python+AI学习基础】Python 入门笔记篇
笔记·python·学习
赢乐1 天前
大模型学习笔记:检索增强生成(RAG)架构
人工智能·python·深度学习·机器学习·智能体·幻觉·检索增强生成(rag)
XinZong1 天前
OpenClaw 实现「龙虾」vs 龙虾 vs 用户 ws对话实现方案 + 实际落地项目
javascript
浪里行舟1 天前
你的品牌正在被AI“遗忘”?用BuildSOM找回搜索的下一个风口
人工智能·python·程序员
卷帘依旧1 天前
WebSocket 比 SSE 复杂在哪里
javascript
码界筑梦坊1 天前
120-基于Python的食品营养特征数据可视化分析系统
开发语言·python·信息可视化·数据分析·毕业设计·echarts·fastapi
logo_281 天前
Xpath语法规则的学习和使用
javascript·python·xpath·xpath语法
快乐江湖1 天前
「层层包装」—— 装饰器模式
开发语言·python·装饰器模式
摘星小杨1 天前
如何在前端循环调取接口,实时查询数据
开发语言·前端·javascript