python 单例模式

这篇具有很好参考价值的文章主要介绍了python 单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python 单例模式

单例模式是一种设计模式,目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

有些类只需要一个全局唯一的实例,例如数据库连接池、线程池、日志记录器等。使用单例模式可以确保这些类只有一个实例存在,从而避免了资源的浪费和不一致的状态。

单例模式通常包含以下几个要素:

  1. 私有化构造方法:将类的构造方法私有化,使得外部无法直接实例化该类。

  2. 静态实例变量:在类中定义一个静态变量,用来保存类的唯一实例。

  3. 全局访问点:提供一个全局的静态方法或属性,用来获取类的唯一实例。通过该访问点,可以在任何需要使用该实例的地方获取到单例对象。

示例代码如下:

class A(object):
    _instance = None
    def __new__(cls, *args, **kw):
        if not cls._instance:
            cls._instance = super(A, cls).__new__(cls, *args, **kw)
        return cls._instance

这段代码定义了一个名为 Conf 的类,它实现了单例模式,并且在多线程环境下保证线程安全。

解释

__new__函数

__new__ 函数在 Python 中创建并返回一个对象实例,在对象创建之前被调用,用来控制对象的创建过程。

__new__ 方法的定义形式如下:

def __new__(cls, *args, **kwargs):
    # 实现代码
    return object.__new__(cls)

cls 参数代表要创建的类本身,*args**kwargs 是用来传递给类的构造方法的参数。

__new__ 方法的作用是创建并返回一个类的实例。可以在对象实例化之前对对象进行定制化的操作。通常情况下不会直接重写 __new__ 方法,而是在类的构造方法 __init__ 中进行对象的初始化和属性赋值。

__new__ 方法通常用于以下情况:

  1. 当需要控制对象的创建过程,或者需要返回一个不可变的对象时,可以重写__new__方法。
  2. 当需要自定义类的实例化过程,或者需要改变实例化的行为时,可以重写__new__方法。

实现过程

  1. A类中定义了一个类变量 _instance,用来保存类的唯一实例。该变量在类的作用域内是全局唯一的。

  2. 在 __new__ 方法中,首先判断 _instance 是否已经存在实例。如果不存在,则通过调用 super(A, cls).__new__(cls, *args, **kw) 创建一个新的实例,并将其赋值给 _instance。这样第一次调用 __new__ 方法时会创建一个新的实例,并将其赋给 _instance。从第二次开始的调用,由于 _instance 已经存在实例,就直接返回该实例。

  3. 无论是创建了新的实例还是直接返回已存在的实例,都会将实例返回。无论多少次调用该类的构造方法,都只会返回同一个实例,实现了单例模式。因为 _instance 是一个类变量,所以它在类的所有实例之间是共享的,保证了只有一个实例被创建和返回。

  4. 这段代码还加入了线程安全的考虑。因为在多线程环境下,可能会有多个线程同时调用该类的构造方法。为了保证线程安全,通过检查 cls._instance 是否已经存在实例,可以避免多个线程同时创建实例的情况,从而保证了线程安全性。

扩展

上面的 cls 可以换成 self 吗

在 __new__ 方法中,cls 是一个约定俗成的参数名,代表当前类本身。虽然可以将 cls 替换为 self,但这是不推荐的做法,因为 self 通常用于表示实例对象,而不是类对象。

在 __new__ 方法中,cls 参数的作用是指明要创建的类。当调用一个类的构造方法时,会自动将类作为第一个参数传递给构造方法,通常我们将该参数命名为 self

而在 __new__ 方法中,由于还没有实例化对象,所以无法使用 self 来表示对象实例。因此使用 cls 来代表要创建的类本身。

cls 和 self 的区别

  • cls:cls 是一个约定俗成的参数名,表示类本身。它在类方法(class method)中使用,用于引用类的属性或调用类的方法。cls 通常作为第一个参数传递给类方法,以区分它与实例方法的不同。通过 cls,我们可以在类方法中访问类的静态成员或创建新的类实例。
class MyClass:
    @classmethod
    def class_method(cls):
        print("This is a class method")

MyClass.class_method()  # 调用类方法
  • self: self 也是一个约定俗成的参数名,表示类的实例本身。它在实例方法(instance method)中使用,用于引用实例的属性或调用实例的方法。self 作为第一个参数传递给实例方法,以便在方法内部访问实例的成员。
class MyClass:
    def __init__(self, name):
        self.name = name

    def instance_method(self):
        print("My name is", self.name)

obj = MyClass("John")
obj.instance_method()  # 调用实例方法

使用场景举例

cls 在类方法中使用,用于引用类的属性或调用类的方法。它通常用于在类方法内部访问类级别的属性或创建新的类实例。

class MyClass:
    class_attribute = "Class Attribute"

    @classmethod
    def class_method(cls):
        print(cls.class_attribute)  # 访问类级别的属性

MyClass.class_method()  # 调用类方法
print(MyClass.class_attribute)  # 直接访问类级别的属性

self在实例方法中使用,用于引用实例的属性或调用实例的方法。它通常用于在实例方法内部访问实例级别的属性或调用其他实例方法。文章来源地址https://www.toymoban.com/news/detail-608974.html

class MyClass:
    def __init__(self):
        self.instance_attribute = "Instance Attribute"

    def instance_method(self):
        print(self.instance_attribute)  # 访问实例级别的属性

obj = MyClass()
obj.instance_method()  # 调用实例方法
print(obj.instance_attribute)  # 访问实例级别的属性

到了这里,关于python 单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python单例模式介绍、使用

    概念:单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供访问该实例的全局访问点。 功能:单例模式的主要功能是确保在应用程序中只有一个实例存在。 优势: 节省系统资源:由于只有一个实例存在,因此系统的资源占用会比较小。 更好的控制全局变量

    2024年02月16日
    浏览(33)
  • Python实现单例模式

    单例模式是一种常见的设计模式,它保证一个类只能被实例化一次,并提供了一个全局访问点来获取这个唯一的实例 。在Python中,可以通过使用装饰器、元类或模块等方式实现单例模式。    在装饰器的内函数中,判断字典是否已经有键值对。如果没有,则添加一个类和类实

    2024年02月15日
    浏览(30)
  • 用Python实现单例模式

    单例模式是指 在内存中只会创建且仅创建一次对象的设计模式 。在程序中多次使用 同一个对象且作用相同时 ,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序 仅在内存中创建一个对象 ,让所有需要调用的地方都共享这一单例对象。 单例模式只允许创建一个对

    2023年04月08日
    浏览(30)
  • python实现单例模式及其应用

    单例模式是一种常见的设计模式,它保证一个类只能被实例化一次,并提供了一个全局访问点来获取这个唯一的实例。 在 Python 中,可以通过使用装饰器、元类或模块等方式实现单例模式。下面分别介绍这三种方法: 1.使用装饰器实现单例模式 解析: 上述代码中,我们定义

    2024年02月07日
    浏览(41)
  • Python 面向对象之单例模式

    单例模式是一种设计模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点。 单例模式通常用于管理共享的资源,例如配置信息、数据库连接、线程池等。 关键点在于如何判断这个类是否已经实例化 通过模块导入:借助模块的底层导入原理 通过元类实现:元

    2024年01月25日
    浏览(59)
  • python 单例模式,装饰类,装饰函数

    知乎 python 实现单例模式的两种方式 stack overflow 装饰函数 vs 装饰类 medium Do we even need a class to realize singleton? 单例模式大家肯定不陌生了,在读reference的两篇blog时突然发现用python实现单例模式的很多好玩之处。 用类实现单例模式是各种语言比较通用的方式。在python中的实现就

    2024年02月16日
    浏览(38)
  • Python入门【​编辑、组合、设计模式_工厂模式实现 、设计模式_单例模式实现、工厂和单例模式结合、异常是什么?异常的解决思路 】(十七)

    👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 🔥如果感觉博主的文章还不错的

    2024年02月14日
    浏览(42)
  • Python 实现单例模式的五种写法!

    单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类

    2024年02月10日
    浏览(46)
  • python使用单例模式加载config.ini配置文件

    在Python中,可以使用单例模式来加载和管理配置文件。下面是一个示例代码: 在上面的示例中, ConfigLoader 是一个单例类,通过 get_instance 方法获取实例。在实例化的过程中,会读取并解析 config.ini 配置文件。通过 get_value 方法可以根据指定的节和键来获取配置值。使用时,只

    2024年01月24日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包