• 设计模式---单例模式


    #! /usr/bin/env python
    # -*- coding:utf-8 -*-

    # 1.单例模式:所有对象封装的数据相同时
    # 单例模式(Singleton Pattern)是一种常用的软件设计模式,
    # 该模式的主要目的是确保某一个类只有一个实例存在。
    # 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
    # 比如,某个服务器程序的配置信息存放在一个文件中,
    # 客户端通过一个 AppConfig 的类来读取配置文件的信息。
    # 如果在程序运行期间,有很多地方都需要使用配置文件的内容,
    # 也就是说,很多地方都需要创建 AppConfig 对象的实例,
    # 这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,
    # 尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,
    # 我们希望在程序运行期间只存在一个实例对象。
    #
    # 在 Python 中,我们可以用多种方法来实现单例模式:
    #
    # 1.使用模块
    # 其实,Python 的模块就是天然的单例模式,
    # 因为模块在第一次导入时,会生成 .pyc 文件,当
    # 第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
    # 因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

    # 2.使用 __new__
    class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kw):
    if not cls._instance:#如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance
    cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
    return cls._instance


    class MyClass(Singleton):
    a = 1

    one = MyClass()
    two = MyClass()
    print(one == two,id(one),id(two))
    # 3.使用装饰器(decorator)
    #装饰器(decorator)可以动态地修改一个类或函数的功能
    def deco1(func):
    """
    装饰器方法,
    :param func:被修饰函数
    :return:返回计算结果
    """
    list1={}
    def _deco1(*args, **kwargs):
    if func not in list1:
    list1[func] = func(*args, **kwargs)
    return list1[func]
    return _deco1

    #装饰方法
    @deco1
    def myfunc():
    a = 1

    myfunc()

    #装饰类
    @deco1
    class MyClass2:
    def __init__(self):
    self.xx = 0

    def getval(self):
    return self.xx

    def setval(self, val):
    self.xx = val

    a = MyClass2()
    a.setval(2)

    b = MyClass2()
    print("b=", b.getval())

    # 4.使用元类(metaclass)
    # 元类就是用来创建类的“东西”。元类就是类的类。
    # 函数type实际上是一个Python的内建元类。type就是Python在背后用来创建所有类的元类。
    # 可以创建自己的元类:写一个类的时候为其添加__metaclass__属性
    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]

    # Python2
    # class MyClass(object):
    # __metaclass__ = Singleton

    # Python3
    class MyClass(metaclass=Singleton):
    def __init__(self):
    self.xx = 0

    def getval(self):
    return self.xx

    def setval(self, val):
    self.xx = val
  • 相关阅读:
    链表
    std::map
    linux配置永久ip不生效解决方法
    linux命令英文缩写的含义(方便记忆)
    互联网创业其实就这24种商业模式
    当用反射获取一个model,这个model里面字段有nullable的时候,获取字段真实类型
    自定义alert和confirm
    web上传大文件的配置
    windows服务-log4net的使用
    vs中的各种快捷键
  • 原文地址:https://www.cnblogs.com/wuxinyan/p/9029968.html
Copyright © 2020-2023  润新知