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/

  • 相关阅读:
    防删没什么意思啊,直接写废你~
    绝大多数情况下,没有解决不了的问题,只有因为平时缺少练习而惧怕问题的复杂度,畏惧的心理让我们选择避让,采取并不那么好的方案去解决问题
    Java 模拟面试题
    Crossthread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on
    一步步从数据库备份恢复SharePoint Portal Server 2003
    【转】理解 JavaScript 闭包
    Just For Fun
    The database schema is too old to perform this operation in this SharePoint cluster. Please upgrade the database and...
    Hello World!
    使用filter筛选刚体碰撞
  • 原文地址:https://www.cnblogs.com/springionic/p/10701848.html
Copyright © 2011-2022 走看看