Python 单例模式

  • 原创
  • Madman
  • /
  • 2018-06-12 12:43
  • /
  • 0
  • 202 次阅读

Synopsis: 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场,比如整个应用只生成一个配置文件的实例对象。Python 的模块是天然的单例模式,这在大部分情况下应该是够用的,当然,我们也可以使用装饰器、元类等方法

1. Python模块

Python模块是天然的单例模式,先创建config.py

from configparser import ConfigParser


class SingletonConfig(object):
    def __init__(self, conf_file='/home/wangy/config.ini'):
        self.config = ConfigParser()
        self.config.read(conf_file)

    def getOption(self, section, option):
        return self.config.get(section, option).strip()


my_conf = SingletonConfig()

在其它地方使用时,只需要import导入my_conf这个实例对象即可:

from config import my_conf

port = my_conf.getOption('server', 'port')

2. 装饰器

先创建一个装饰器wrapper.py

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[cls]
    return getinstance

使用时,只需要装饰那个将产生单个实例的类即可:

from configparser import ConfigParser
from wrapper import singleton

@singleton
class SingletonConfig(object):
    def __init__(self, conf_file='/home/wangy/config.ini'):
        self.config = ConfigParser()
        self.config.read(conf_file)

    def getOption(self, section, option):
        return self.config.get(section, option).strip()


a = SingletonConfig()
b = SingletonConfig()

print(a == b)        # 输出 True
print(a is b)        # 输出 True
print(id(a), id(b))  # 输出 140012777804856 140012777804856

3. __new__方法

from configparser import ConfigParser


class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not isinstance(cls._instance, cls):
            cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance


# 需要单实例的类,只要继承Singleton即可
class SingletonConfig(Singleton):
    def __init__(self, conf_file='/home/wangy/config.ini'):
        self.config = ConfigParser()
        self.config.read(conf_file)

    def getOption(self, section, option):
        return self.config.get(section, option).strip()


a = SingletonConfig()
b = SingletonConfig()

print(a == b)  # 输出 True
print(a is b)  # 输出 True
print(id(a), id(b))  # 输出 140376512881944 140376512881944

4. 元类

from configparser import ConfigParser


class Singleton(type):
    _instances = {}

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


class SingletonConfig(metaclass=Singleton):
    def __init__(self, conf_file='/home/wangy/config.ini'):
        self.config = ConfigParser()
        self.config.read(conf_file)

    def getOption(self, section, option):
        return self.config.get(section, option).strip()


a = SingletonConfig()
b = SingletonConfig()

print(a == b)  # 输出 True
print(a is b)  # 输出 True
print(id(a), id(b))  # 输出 140119409513696 140119409513696
未经允许不得转载: LIFE & SHARE - 王颜公子 » Python 单例模式

分享

作者

作者头像

Madman

如果博文内容有误或其它任何问题,欢迎留言评论,我会尽快回复; 或者通过QQ、微信等联系我

0 条评论

暂时还没有评论.

发表评论前请先登录