zoukankan      html  css  js  c++  java
  • 25、面向对象(单例)


    25.1、介绍:

    1、单例即单个实例,指的是同一个类实例化多次的结果指向同一个对象,用于节省内存空间;

    2、如果我们从配置文件中读取配置来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了;


    25.2、示例:

    1、定义一个 settings.py 文件内容如下:

    HOST='1.1.1.1'

    PORT=3306


    2、定义一个类方法实现单例模式:

    import settings


    class Mysql:

    __instance = None

    # 定义一个类的实例化数据属性


    def __init__(self, host, port):

    self.host = host

    self.port = port


    @classmethod

    # 定义一个类方法

    def singleton(cls):

    if not cls.__instance:

    cls.__instance = cls(settings.HOST, settings.PORT)

    # 如果实例不存在就创建实例

    return cls.__instance

    # 如果实例存在就返回存在的实例



    obj1 = Mysql('1.1.1.2', 3306)

    obj2 = Mysql('1.1.1.2', 3306)

    print(obj1 is obj2)

    # obj1和obj2不是同一个对象

    # False


    obj3 = Mysql.singleton()

    obj4 = Mysql.singleton()

    print(obj3.host, obj3.port, obj4.host, obj4.port)

    # 1.1.1.1 3306 1.1.1.1 3306

    print(obj3 is obj4)

    # obj3和obj4是同一个对象

    # True


    3、定义一个装饰器实现单例模式:

    import settings


    #3

    def singleton(cls): # cls = Mysql

    #4

    __instance = cls(settings.HOST, settings.PORT)

    #5

    def wrapper(*args, **kwargs):

    if args or kwargs:

    obj = cls(*args, **kwargs)

    return obj

    return __instance

    #6

    return wrapper


    #2

    @singleton # Mysql = singleton(Mysql) = wrapper

    class Mysql:

    def __init__(self, host, port):

    self.host = host

    self.port = port


    #1

    obj1 = Mysql()

    obj2 = Mysql()

    obj3 = Mysql()

    print(obj1 is obj2 is obj3)

    # True


    obj4 = Mysql('1.1.1.3', 3308)

    obj5 = Mysql('1.1.1.3', 3308)

    print(obj3 is obj4)

    # False








  • 相关阅读:
    了解外界的窗口
    博客添加卡通精灵
    LINUX chage 命令 以及常用参数
    Linux系统 端口知识以及相关监听工具
    Linux 常用命令之cp
    树莓派的知识分享
    ghost一键备份还原工具使用指南
    使用rsync在Windows(服务端)与Linux (客户端)之间的同步
    制作linux 随身碟
    白嫖!1000+个常用的Linux命令!
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/12320496.html
Copyright © 2011-2022 走看看