码迷,mamicode.com
首页 > 编程语言 > 详细

python3.6_单例模式

时间:2019-03-26 16:51:10      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:type   dong   引用   ret   int   创建过程   单例模式   func   tac   

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

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_单例模式

标签:type   dong   引用   ret   int   创建过程   单例模式   func   tac   

原文地址:https://www.cnblogs.com/xiuxiu123456/p/10600971.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!