码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式的四种实现方式

时间:2019-03-10 20:54:52      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:代码   存储   引用   技术   python   控制   asa   名称   了解   

在这之前,先了解super()和__new__()方法

super()方法:

返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法。

它有两个典型作用:

a. 在单继承的类层次结构中,super()可用于引用父类而不显式父类名称,从而使代码更易于维护。

b. 在多重继承中,可以保证公共父类仅被执行一次。

__new__方法:

a.它是一个类级别的静态方法。通常用于控制生成一个新实例的过程。

b.返回的是一个实例化出来的实例

 

下面为四种实现单例模式的方法

1. 使用__new__方法

技术图片
class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, ‘_instance‘):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kwargs)
        rerurn cls._instance

class A(Singleton):
    pass

# 类A即为单例类
技术图片

 

2.共享属性

技术图片
# 创建实例时把所有实例的__dict__指向同一个字典,这样它们都具有相同的属性和方法(类的__dict__存储对象属性)
class Singleton(object):
    _state = {}
    def __new__(cls, *args, **kwargs):
        ob = super(Singleton,cls).__new__(cls, *args, **kwargs)
        ob.__dict__ = cls._state
    return ob
class B(Singleton): pass
# 类B即为单例类
技术图片

 

3.使用装饰器

技术图片
def singleton(cls):
    instance = {}
    def wapper():
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return wapper

@singleton
class C:
    pass

# 类C即为单例类
技术图片

 

4.import方法

技术图片
# 作为Python模块时是天然的单例模式

#创建一个sington.py文件,内容如下:
    class Singleton(object):
        def foo(self):
            pass
    mysington = Singleton()

# 运用
from sington import mysington
mysington.foo()

单例模式的四种实现方式

标签:代码   存储   引用   技术   python   控制   asa   名称   了解   

原文地址:https://www.cnblogs.com/myiuni/p/10506802.html

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