zoukankan      html  css  js  c++  java
  • Python中的单例模式

    单例模式是一种经常使用的设计模式,其定义解释很好理解,核心是一个实例对象,更加详细的解释就更是百度一个一大堆了,这里说 Python 中单例模式的实现的几种方法:

    ​单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

    使用模块

    Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

     1 # a.py中的内容
     2 
     3 class Student(object):
     4     def eat():
     5         pass
     6 
     7 s = Student()
     8 
     9 
    10 # b.py中的内容
    11 
    12 from a import s
    13 
    14 ## a.py和b.py在同一路径下

     

    使用 __new__ 方法

    __new__()__init__()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例 这个绝对常考

    1 class Singleton(object):
    2 
    3      _instance = None
    4     def __new__(cls, *args, **kwargs):
    5         if not cls._instance:
    6             cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  
    7         return cls._instance 

    在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance

    使用装饰器

    装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例

     1 from functools import wraps
     2  
     3 def singleton(cls):
     4     instances = {}
     5     @wraps(cls)
     6     def getinstance(*args, **kwargs):
     7         if cls not in instances:
     8             instances[cls] = cls(*args, **kwargs)
     9         return instances[cls]
    10     return getinstance
    11  
    12 @singleton
    13 class MyClass(object):
    14     a = 1

    使用 metaclass

    元类(metaclass)可以控制类的创建过程,它主要做三件事:

    • 拦截类的创建
    • 修改类的定义
    • 返回修改后的类
     1 class Singleton(type):
     2     _instances = {}
     3     def __call__(cls, *args, **kwargs):
     4         if cls not in cls._instances:
     5             cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
     6         return cls._instances[cls]
     7 
     8 
     9 
    10 class MyClass(metaclass=Singleton):
    11     pass

    参考链接:http://python.jobbole.com/87294/

  • 相关阅读:
    嵌套循环td时补齐td的解决方法
    [web.aspNet]vs2005无法断点调试网站,断点失效 IE8 vss6.0
    使IE6下PNG背景透明的七种方法任你选
    VBA之Range对象在Excel单元格赋值示例
    css控制透明度
    SQL2000中用backup 备份数据库
    软件开发人才级别划分
    sql server事务全攻略(转载)
    程序员不是神,心态决定一切
    一个真正合格程序员的七种素质
  • 原文地址:https://www.cnblogs.com/springionic/p/10701848.html
Copyright © 2011-2022 走看看