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


    #! /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
  • 相关阅读:
    问题:弹窗还没点击确认就执行了跳转
    关于版本的问题
    timeUtil
    使用jframe编写一个base64加密解密工具
    JMeter 命令行(非GUI模式)详解(一)-分布式(远程)执行脚本及查看指定结果、日志
    jmeter分布式压测 java.io.FileNotFoundException: rmi_keystore.jks (系统找不到指定的文件。)
    mysql5.7日志时间与系统时间不一致
    mysql查看执行sql语句的记录日志
    Appium如何获取appPackage和appActivity
    关于测试设置
  • 原文地址:https://www.cnblogs.com/wuxinyan/p/9029968.html
Copyright © 2020-2023  润新知