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()
相关推荐
老歌老听老掉牙2 小时前
Python 模块深度解析:从创建、导入到属性机制
python·模块
2301_795099742 小时前
HTML5中Object标签定义外部资源容器的备份逻辑
jvm·数据库·python
z4424753262 小时前
CSS如何保证移动端顶部Fixed头部的安全区域
jvm·数据库·python
weixin_458580122 小时前
golang如何优化反射性能_golang反射性能优化技巧
jvm·数据库·python
深蓝海拓2 小时前
Qt:创建一套基于HSL颜色体系的颜色库
笔记·python·qt·学习·ui
步辞2 小时前
CSS如何解决小屏幕上的长单词截断版面
jvm·数据库·python
Thanks_ks2 小时前
【第 001 讲】计算机底层基础与 Python 生态全景:硬件架构 | 语言演进 | 执行机制 | 语言特性 | 解释器 | 版本策略
python·编程语言·python入门·计算机基础·解释器·底层原理·cpython
qq_460978402 小时前
如何在无向图中找出从任意节点可达的所有节点(连通分量识别)
jvm·数据库·python
大蚂蚁2号2 小时前
本地视频转文字|video2text
python·音视频·视频转文本