python3.6_单例模式

Posted xiuxiu123456

tags:

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

单例模式的几种实现方式:

1.使用模块

2.使用__new__

3.使用装饰器

4.使用元类

使用模块:python的模块就是天然的单例模式,因为模块在第一次导入的时候,会生成.pyc的文件,在第二次导入的时候就会直接加载.pyc文件,而不会再次执行模块代码

使用__new__:

# 实例化一个单例
class Singleton(object):
    __instance = None

    def __new__(cls, age, name):
        #如果类属性__instance的值为None,
        #那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
        #能够知道之前已经创建过对象了,这样就保证了只有1个对象
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

a = Singleton(18, "dongGe")
b = Singleton(8, "dongGe")

print(id(a))
print(id(b))

使用装饰器:

from functools import wraps


def singleton(cls):
    instances = {}

    @wraps(cls)
    def getinstance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances

    return getinstance


@singleton
class Bar:
    pass


b0 = Bar()
b1 = Bar()
print(id(b0))
print(id(b1))

使用元类:

元类(metaclass)可以控制类的创建过程

class Singleton(type):
    """
    元类继承type
    """
    _instance = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instance:
            cls._instance[cls] = super().__call__(*args, **kwargs)
        return cls._instance


class Bar(metaclass=Singleton):
    pass


b0 = Bar()
b1 = Bar()
print(id(b0))
print(id(b1))

 

以上是关于python3.6_单例模式的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之八设计模式和异常

设计模式之单例模式

Python面向对象之单例模式

单例设计模式代码实现

Java_static关键字,单例设计模式,代码块,final关键字,接口,内部类

python中的单例设计模式