Python中的单例模式与反弹机制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的单例模式与反弹机制相关的知识,希望对你有一定的参考价值。
参考技术A一。单例模式
一般情况下,类可以生成任意个实例,而单例模式只生成一个实例
我们先用单例模式设计一个Rectangle类
然后用__new__方法设计单例模式,代码如下
然后我们来验证下,单例模式下是否只能生成一个实例
单例模式在程序设计中比较典型的应用场景:多个用户同时调用某个模块时,会生成一些日志,我们希望这些日志存在同一个文件内,而不是多个文件。
在生成日志模块我们就可以采用单例模式进行设计。
二。反射
概念:简单来说就是可以利用字符串来映射模块中的相应方法然后可以操作模块中相应的方法
我们以一个饭店点菜的实际场景来理解Python的反射机制
hasatter(对象,属性或方法名)
判断对象中是否有某个属性或某个方法,返回值是布尔型
getattr(对象,属性或方法名,缺省值) 判断对象中是否有某个属性或某个方法,如果有返回方法本身,没有则返回缺省值
setattr(对象,属性,新值)
将实例的属性改为新的值,如果属性不存在则新建
我们给实例guke1加个价格属性
Python中的单例模式
介绍
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
单例模式的实现
方式一:python就是天然的单例模式
其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc
文件,当第二次导入时,就会直接加载 .pyc
文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
class Person(): def foo(self): pass p1 = Person()
在另一个文件中导入使用就可以了。
from a.b import p1 print(id(p1.foo()))
你会发现,不管使用多少次,或者在几个文件中引用,每次打印的id都是相同的。
方式二:使用装饰器
def outer(cls): instance = None def inner(*args,**kwargs): nonlocal instance if instance == None: instance = cls(*args,**kwargs) return instance return inner @outer class Person(): def __init__(self): pass p1 = Person() p2 = Person() print(id(p1)) print(id(p2))
id打印结果
方式三:用__new__方式实现单例模式
我们知道,当我们实例化一个对象时,是先执行了类的__new__方法(我们没写时,默认调用object.__new__),实例化对象;然后再执行类的__init__方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式。
class Person(object): __instance = None def __new__(cls, *args, **kwargs): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance def __init__(self): pass p1 = Person() p2 = Person() print(id(p1)) print(id(p2))
id打印结果
好了,先介绍这三种吧,python实现单例模式方式有很多,但是另外几种我自己都还没有弄清楚。。。以后慢慢补。
未完待续。。。
以上是关于Python中的单例模式与反弹机制的主要内容,如果未能解决你的问题,请参考以下文章