用故事的形式趣说Python单例模式

Posted 马哥Linux运维

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用故事的形式趣说Python单例模式相关的知识,希望对你有一定的参考价值。

来源:Python知识圈

ID:PythonCircle

 阅读文本大概需要 5 分钟。

前言

在我们的真实世界之外,网络世界也是异常的紧张和繁忙,他们各司其职。最忙的当属 CPU 了,每天 24 小时都在工作,真的是整天神龙见首不见尾。

大家都在这紧张的节奏中工作着。有一天,小 c 加班到很晚,背着电脑包在路上走着。忽然发现了之前见过的小 d,他追上去拍了一下小 d 的肩膀说,嘿,小 d,你也刚下班呀?小 d 满脸的黑人问号,你是谁呀?

用故事的形式趣说Python单例模式

小 c 说你不认识我了?我们都是 Python 爸爸大家族里一个 Animal 类实例化出来的对象呀。我是 cat 对象,你是 dog 对象,当时 Animal 类创造我们的时候,我还拍照了呢。我给你看看照片。

# 定义一个 Animal 类
class Animal():
    pass


cat = Animal() # 这是小 c
dog = Animal() # 这是小 d

内存地址

# 定义一个 Animal 类
class Animal():
    pass


cat = Animal()
dog = Animal()

print('小 c 家的地址是:', id(cat))
print('小 d 家的地址是:', id(dog))
小 c 家的地址是: 4426348528
小 d 家的地址是: 4427809512

小 d 惊呼道,哇,很神奇耶,这个 id() 方法很强大耶,接着,小 c 指着盒子的背面的文字给小 d 看,这是 id() 方法的说明书。

Return the identity of an object.

This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)

单例模式

小 c 和 小 d 点了两杯卡布基诺,小 c 说到,单例模式是保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Python 中,一个类创建对象实例是通过调用父类 object 的 __new__(cls) 方法来创建对象的。我们可以通过重写 __new(cls) 方法去实现类只创建一个实例。

# 定义一个 Animal 类
class Animal():
    # 定义一个类属性保存对象
    __instance = None

    def __new__(cls, *args, **kwargs):

        # 如果 instance 为空证明是第一次创建实例
        if cls.__instance == None:
            # 通过父类的__new__(cls)创建实例
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            # 返回上一个对象的引用
            return cls.__instance


cat = Animal()
dog = Animal()

print('小 c 家的地址是:', id(cat))
print('小 d 家的地址是:', id(dog))
小 c 家的地址是: 4460020456
小 d 家的地址是: 4460020456

小 d 惊呼道:哇,好神奇啊。

但是,我还有个问题,单例模式有什么好处呢?

单例模式作用

小 c 说,单例模式有自己的优缺点。

优点

1、实例控制

单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

2、灵活性

因为类控制了实例化过程,所以类可以灵活更改实例化过程。

缺点

1、开销

虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。

2、可能的开发混淆

使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

3、对象生成期

不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于 .NET Framework 的语言),只有单例类能够导致单例类中出现悬浮引用。

所以,我们需要根据自己的需求,是否选择使用单例模式来解决问题。

通过小 c 的讲解,小 d 终于明白了,他们一起走出Hello World 咖啡馆,消失在灯火阑珊的夜色中。

用故事的形式趣说Python单例模式

用故事的形式趣说Python单例模式 马哥实战学院 入门课程免费学习

以上是关于用故事的形式趣说Python单例模式的主要内容,如果未能解决你的问题,请参考以下文章

趣说单例模式——选班长

小华的故事--单例模式

Django 知识补漏单例模式

Django 知识补漏单例模式

爱上面试的凑弟弟--你再问我单例模式试试?

设计模式趣说访问者模式,颇有些无奈之举