导航:首页 > 编程语言 > python单件模式

python单件模式

发布时间:2022-05-07 15:28:13

‘壹’ python如何实现单例模式

有些时候你的项目中难免需要一些全局唯一的对象,这些对象大多是一些工具性的东西,在Python中实现单例模式并不是什么难事。以下总结几种方法:
使用类装饰器
使用装饰器实现单例类的时候,类本身并不知道自己是单例的,所以写代码的人可以不care这个,只要正常写自己的类的实现就可以,类的单例有装饰器保证。
def singleton(cls):
instances = {}
def _wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _wrapper
你会发现singleton装饰器内部使用了一个dict。当然你也可以用其他的方式,不过以下的实现是错误的:
def singleton(cls):
_instance = None #外部作用域的引用对于嵌套的内部作用域是只读的
def _wrapper(*args, **kwargs):
if _instance is None: #解释器会抛出"UnboundLocalError: ...referenced before assignment"
_instance = cls(*args, **kwargs) #赋值行为使解释器将"_instance"看作局部变量
return _instance
return _wrapper
使用元类(__metaclass__)和可调用对象(__call__)
Python的对象系统中一些皆对象,类也不例外,可以称之为”类型对象”,比较绕,但仔细思考也不难:类本身也是一种对象,只不过这种对象很特殊,它表示某一种类型。是对象,那必然是实例化来的,那么谁实例化后是这种类型对象呢?也就是元类。
Python中,class关键字表示定义一个类对象,此时解释器会按一定规则寻找__metaclass__,如果找到了,就调用对应的元类实现来实例化该类对象;没找到,就会调用type元类来实例化该类对象。
__call__是Python的魔术方法,Python的面向对象是”Duck type”的,意味着对象的行为可以通过实现协议来实现,可以看作是一种特殊的接口形式。某个类实现了__call__方法意味着该类的对象是可调用的,可以想象函数调用的样子。再考虑一下foo=Foo()这种实例化的形式,是不是很像啊。结合元类的概念,可以看出,Foo类是单例的,则在调用Foo()的时候每次都返回了同样的对象。而Foo作为一个类对象是单例的,意味着它的类(即生成它的元类)是实现了__call__方法的。所以可以如下实现:
class Singleton(type):
def __init__(cls, name, bases, attrs):
super(Singleton, cls).__init__(name, bases, attrs)
cls._instance = None
def __call__(cls, *args, **kwargs):
if cls._instance is None
# 以下不要使用'cls._instance = cls(*args, **kwargs)', 防止死循环,
# cls的调用行为已经被当前'__call__'协议拦截了
# 使用super(Singleton, cls).__call__来生成cls的实例
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance

class Foo(object): #单例类
__metaclass__ = Singleton

>>>a = Foo()
>>>b = Foo()
>>>a is b
>>>True
>>>a.x = 1
>>>b.x
>>>1
使用__new__
__init__不是Python对象的构造方法,__init__只负责初始化实例对象,在调用__init__方法之前,会首先调用__new__方法生成对象,可以认为__new__方法充当了构造方法的角色。所以可以在__new__中加以控制,使得某个类只生成唯一对象。具体实现时可以实现一个父类,重载__new__方法,单例类只需要继承这个父类就好。
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance

class Foo(Singleton): #单例类
a = 1

‘贰’ python 单例

类的静态变量要用classmethod来实现:
import os,sys
class A():
static_data = -1
@classmethod
def set_last(cls, newdata):
temp = cls.static_data
cls.static_data = newdata
return temp

o1=A()
print o1.static_data
A.set_last(12)
print A.static_data
o2=A()
print o2.static_data

输出:
-1
12
12

‘叁’ 怎么理解python单例模式

在聊这之前我们首先要明确的是,单例模式在实际中的意义以及在python中具有实现的价值?

当前,相信有很多人支持单例模式,也有不少人反对,尤其是在python中,目前依旧具有很大的争议性。我们要在评论之前首先要了解单例模式

什么是单例模式?

顾名思义:就是单个模式

单例模式是一种常见的软件设置模式,在它的核心结构中只包含一个被称为单例类的特殊类,通过单例模式可以保证系统中的一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个对象只能存在一个,单例模式是最好的解决方案。

单例模式的要点有三类

‘肆’ Python有设计模式么

Python设计模式主要分为三大类:创建型模式、结构型模式、行为型模式;三 大类中又被细分为23种设计模式,以下这几种是最常见的。
单例模式:是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个是实例时,单例对象就能派上用场。单例对象的要点有三个:一是某个类只能有一个实例;二是它必须自行创建整个实例,三是它必须自行向整个系统提供这个实例。
工厂模式:提供一个创建对象的接口,不像客户端暴露创建对象的过程,使用一个公共的接口来创建对象,可以分为三种:简单工厂、工厂方法、抽象工厂。一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式。
策略模式:是常见的设计模式之一,它是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。换句话来讲,就是针对一个问题而定义出一个解决的模板,这个模板就是具体的策略,每个策略都是按照这个模板进行的,这种情况下我们有新的策略时就可以直接按照模板来写,而不会影响之前已经定义好的策略。
门面模式:门面模式也被称作外观模式。定义如下:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。门面模式注重统一的对象,也就是提供一个访问子系统的接口。门面模式与模板模式有相似的地方,都是对一些需要重复方法的封装。但本质上是不同的,模板模式是对类本身的方法的封装,其被封装的方法也可以单独使用;门面模式,是对子系统的封装,其被封装的接口理论上是不会被单独提出来使用的。

‘伍’ Python如何写一个多线程下可以使用的单例模式

1。 在数据获取方面强烈推荐使用TuShare 2。 在我们A股推荐成熟的pyalgotrade 3。测试策略 如:Ricequant 4。恒生的python-恒生量化社区 5。python的量化回测框架 QuantDigger

‘陆’ Python中的单例模式的几种实现方式的及优化

单例模式就是 : 1、类的构造函数为private,即外部程序不能通过new关键字创建对象的实例 2、类中提供一个private static的 类变量引用 ; 3、单例类中提供静态方法 定义为 public static 的方法获取一个类的实例 ; 4、静态方法返回 类的引用,...

‘柒’ 关于python单例模式求教大佬

因为在__new__函数里给__instance赋了新值_
__new__函数的作用就是,如果__instance还是None,就给cls.__instance新值,然后返回 __instance的值

‘捌’ python常用的几种设计模式是什么

python常用的几种设计模式有:1、单例模式,确保某一个类只有一个实例;2、工厂模式,使用一个公共的接口来创建对象;3、策略模式,随着策略对象改变内容;4、门面模式,对子系统的封装,使得封装接口不会被单独提出来。

什么是设计模式?

设计模式是一套被反复使用,多数人知道,经过分类编目的代码设计经验总结。

使用设计模式是为了提高代码可重用性,可阅读性,和可靠性。

你说理解的设计模式有几种?

设计模式又可分为三种:创建型(单例模式)、(工厂模式),结构型,行为型(策略模式)

单例模式以及应用场景:

(1)确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。Windows的Task Manager(任务管理器)、Recycle Bin(回收站)、网站计数器

(2)单例模式应用的场景一般发现在以下条件下:

资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。控制资源的情况下,方便资源之间的互相通信。如线程池等

要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

工厂模式:

提供一个创建对象的接口,不像客户端暴露创建对象的过程,而是使用一个公共的接口来创建对象。

可以分为三种:简单工厂 工厂方法 抽象工厂

一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

策略模式:

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

要点:把一个个策略,也就是算法封装成一个一个类,任意的替换

解决的问题:避免多个if....else带来的复杂

使用场景:系统中需要动态的在集中算法中动态的选择一种,

门面模式:

门面模式也叫外观模式,定义如下:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。门面模式注重“统一的对象”,也就是提供一个访问子系统的接口。门面模式与之前说过的模板模式有类似的地方,都是对一些需要重复方法的封装。但从本质上来说,是不同的。模板模式是对类本身的方法的封装,其被封装的方法也可以单独使用;而门面模式,是对子系统的封装,其被封装的接口理论上是不会被单独提出来用的。

一个对象有很多行为,如果么有选择合适的设计模式,这些行为就需要用多重的条件判断来实现算法的切换,增加了代码的复杂度。

推荐课程:Python面对对象(Corey Schafer)

阅读全文

与python单件模式相关的资料

热点内容
安卓qq邮箱格式怎么写 浏览:429
如何电信租用服务器吗 浏览:188
编程中计算根号的思维 浏览:181
可爱的程序员16集背景音乐 浏览:446
软件代码内容转换加密 浏览:795
什么app看电视不要钱的 浏览:16
乌班图怎么安装c语言编译器 浏览:278
plc通讯块编程 浏览:923
我的世界服务器怎么清地皮 浏览:421
ftp服务器如何批量改名 浏览:314
网易我的世界服务器成员如何传送 浏览:268
公司云服务器远程访问 浏览:633
法哲学pdf 浏览:637
清大阅读app是什么 浏览:447
怎么用qq浏览器整体解压文件 浏览:585
肺组织压缩15 浏览:270
安卓手机为什么换电话卡没反应 浏览:797
诸子集成pdf 浏览:339
php注册框代码 浏览:718
手机加密好还是不加好好 浏览:815