python3单例-python3如何运行文件夹python单例模式

单例模式是一种常用的软件设计模式.

在单例模式的核心结构中,只包含一个被称为单例类的特殊类.

通过单例模式可以保证系统中一个类只有一个实例,而且这个实例可以轻易被外界访问,方便控制实例对象的个数以节约系统资源.

单例模式是解决一个系统中某个类的实例化对象有且只能有一个的最好解决方案.

单例模式的要点有三个:

某个类只能有一个实例

这个类必须自行创建其唯一实例

这个类必须自行向整个系统提供这个唯一实例.

在python中,单例模式有三种实现方式:

方法一,使用__new__方法

先定义一个类,类中定义__new__方法,然后将类的一个实例类绑定到类变量中.

如果类的_instance值为None,则说明这个类还没有被实例化过,程序会自动实例化一个类的实例,然后返回.

如果类的_instance值不为None,则程序会直接返回_instance.

代码如下:

class Singleton(object):

_instance = None

def __init__(self):

pass

def __new__(cls, *args, **kwargs):

if not cls._instance:

cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)

return cls._instance

class MyClass(Singleton):

a = 1

电脑技术网认为此文章对《python3如何运行文件夹python单例模式》说的很在理。

在上面的代码中,我们将类的实例和一个类变量 _instance关联起来.

如果 cls._instance为 None 则创建实例,否则直接返回cls._instance。

用上来定义的类实例化两个对象:

cls1=MyClass()

cls2=MyClass()

print(id(cls1))

print(id(cls2))

print(cls1 == cls2)

print(cls1 is cls2)

得到的结果

43606480

43606480

True

True

方法二,使用decorator装饰器

我们知道,装饰器(decorator)可以动态地修改一个类或函数的功能。

在这里使用装饰器来装饰某个类,使其只能生成一个实例,代码如下:

def singleton(cls):

instances={}

def getinstance(*args,**kwargs):

if cls not in instances:

instances[cls]=cls(*args,**kwargs)

return instances[cls]

return getinstance

@singleton

class MyClass(object):

a=1

在上面,我们定义了一个装饰器singleton,它返回了一个内部函数getinstance,该函数会判断某个类是否在字典instances中,

如果不存在,则会将cls作为key,cls(*args, **kw)作为value存到instances中,否则,直接返回instances[cls]。

使用上面定义的类实例化两个对象,比较两个对象

cls1=MyClass()

cls2=MyClass()

print(id(cls1))

print(id(cls2))

print(cls1 == cls2)

print(cls1 is cls2)

得到的结果为:

43672016

43672016

True

True

方法三,使用元类(metaclass)

元类(metaclass)可以控制类的创建过程,它主要做三件事:

拦截类的创建

修改类的定义

返回修改后的类

用元类实现单例模式的代码如下:

class Singleton(type):

_inst = {}

def __call__(self, *args, **kw):

if self not in self._inst:

self._inst[self] = super(Singleton, self).__call__(*args, **kw)

return self._inst[self]

class MyClass1(metaclass=Singleton):

def __init__(self):

self.xx = 0

def getval(self):

return self.xx

def setval(self, val):

self.xx = val

cls1=MyClass()

cls2=MyClass()

print(id(cls1))

print(id(cls2))

print(cls1 == cls2)

print(cls1 is cls2)

得到的结果为:

43477984

43477984

True

True

方法四,使用classmethod方法创建单例模式

class Foo:

_instance = None

def __init__(self):

pass

@classmethod

def get_instance(cls):

if cls._instance:

return cls._instance

else:

obj=cls()

cls._instance=obj

return obj

cls1=Foo.get_instance() # 实例化对象a1时,没有执行Foo这个类的__init__方法,直接执行Foo类的get_instance方法,在这里cls代指的是Foo类

# 前面把_instance赋值为None,所以直接执行else中的语句,实例化一个obj对象,然后把obj对象中的_instance方法赋值为obj对象本身,然后返回obj对象

cls2=Foo.get_instance() # 实例化a1时,Foo类中的_instance已经被赋值为obj对象,所以再次执行Foo中的get_instance方法时,是执行if中的语句

# 此时cls._instance就指的是obj对象,所以这里也返回obj这个对象

print(id(cls1))

print(id(cls2))

print(cls1 == cls2)

print(cls1 is cls2)

这种方法由于在实例化对象时要调用类中的get_instance方法,所以用的不多,知道即可.

特别声明

Python的模块是天然的单例模式

在一个py文件中,多次导入同一个模块,这个模块也只有在第一次的时候被导入,后续的该模块导入语句都不会再执行了

更多:python3如何运行文件夹python单例模式

https://www.002pc.comhttps://www.002pc.com/python/2311.html

你可能感兴趣的python,单例,模式

No alive nodes found in your cluster

0踩

0 赞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值