python-元类的几种单例模式

简介: 单例介绍: 单例即单个的实例,指的是同一个类实例化多次的结果都是指向同一个对象,用于节省内存空间 如果我们从配置文件中读取配置信息来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了。 #settings.
+关注继续查看

单例介绍:

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

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

#settings.py文件内容如下
HOST='1.1.1.1'
PORT=3306
# 单例模式:多次实例化的结果指向同一个实例

# 单例模式实现方式一:
'''
import settings

class MySQL:
    __instance=None
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @classmethod
    def from_conf(cls):
        if cls.__instance is None:
            cls.__instance=cls(settings.IP, settings.PORT)
        return cls.__instance
obj1=MySQL.from_conf()
obj2=MySQL.from_conf()
obj3=MySQL.from_conf()
obj4=MySQL('1.1.1.3',3302)
print(obj1)
print(obj2)
print(obj3)
print(obj4)
'''

# 单例模式实现方式二:
'''
import settings

def singleton(cls):
    _instance=cls(settings.IP,settings.PORT)
    def wrapper(*args,**kwargs):
        if len(args) !=0 or len(kwargs) !=0:
            obj=cls(*args,**kwargs)
            return obj
        return _instance
    return wrapper

@singleton #MySQL=singleton(MySQL) #MySQL=wrapper
class MySQL:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

# obj=MySQL('1.1.1.1',3306) #obj=wrapper('1.1.1.1',3306)
# print(obj.__dict__)

obj1=MySQL() #wrapper()
obj2=MySQL() #wrapper()
obj3=MySQL() #wrapper()
obj4=MySQL('1.1.1.3',3302) #wrapper('1.1.1.3',3302)
print(obj1)
print(obj2)
print(obj3)
print(obj4)
'''

# 单例模式实现方式三:
'''
import settings

class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dic):
        #self=MySQL这个类
        self.__instance=self(settings.IP,settings.PORT)

    def __call__(self, *args, **kwargs):
        # self=MySQL这个类
        if len(args) != 0 or len(kwargs) != 0:
            obj=self.__new__(self)
            self.__init__(obj,*args, **kwargs)
            return obj
        else:
            return self.__instance

class MySQL(metaclass=Mymeta): #MySQL=Mymeta(...)
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port


obj1=MySQL()
obj2=MySQL()
obj3=MySQL()
obj4=MySQL('1.1.1.3',3302)
print(obj1)
print(obj2)
print(obj3)
print(obj4)
'''
# 单例模式实现方式四:
def f1():
    from singleton import instance
    print(instance)

def f2():
    from singleton import instance,MySQL
    print(instance)
    obj=MySQL('1.1.1.3',3302)
    print(obj)

f1()
f2()

实现方式四的sigleton文件:

import settings

class MySQL:
    def __init__(self,ip,port):
        self.ip = ip
        self.port =port

interface = MySQL(settings.IP,settings.PORT)

python实现单例的方式有很多种,这里就先讲四种。

焚膏油以继晷,恒兀兀以穷年。
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
缓存 安全 开发者
Python 单例模式讲解和代码示例
Python 单例模式讲解和代码示例
5 0
|
2月前
|
设计模式 搜索推荐 开发者
Python单例模式(Singleton)的N种实现
单例模式保证了在程序的不同位置都可以且仅可以取到同一个对象实例:如果实例不存在,会创建一个实例;如果已存在就会返回这个实例。因为单例是一个类,所以你也可以为其提供相应的操作方法,以便于对这个实例进行管理。
|
4月前
|
设计模式 数据库连接 数据库
一日一技:Python 下面最简单的单例模式写法
一日一技:Python 下面最简单的单例模式写法
34 0
|
5月前
|
Python
Python 基于python实现单例模式
Python 基于python实现单例模式
29 0
|
7月前
|
设计模式 Python
python中实现单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。 例如:服务器程序的配置信息存放在一个文件中,客户端通过一个 Config 的类来读取配置文件的信息。当有很多地方都需要使用配置文件的内容时就需要创建 创建多个Config 对象的实例,从而浪费内存资源,尤其是在配置文件内容很多的情况下。
81 0
|
7月前
|
设计模式 监控 数据库
Python:设计模式之单例模式
Python:设计模式之单例模式
45 0
|
10月前
|
设计模式 Python
【Python零基础入门篇 · 25】:init和new方法、单例模式
【Python零基础入门篇 · 25】:init和new方法、单例模式
【Python零基础入门篇 · 25】:init和new方法、单例模式
|
11月前
|
设计模式 Python
【Python零基础入门篇 · 17】:init和new方法、单例模式
【Python零基础入门篇 · 17】:init和new方法、单例模式
【Python零基础入门篇 · 17】:init和new方法、单例模式
|
11月前
|
设计模式 存储 测试技术
Python 设计模式:单例模式
单例模式可能是最简单的设计模式,单例是非常通用的对象。让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
|
设计模式 监控 数据库
Python:设计模式之单例模式
Python:设计模式之单例模式
推荐文章
更多