单例函数python 单例代码实现( 二 )


总结
单利模式存在的目的是保证当前内存中仅存在单个实例 , 避免内存浪费单例函数python!单例函数python?。?
Python中的单例模式与反弹机制一 。单例模式
一般情况下,类可以生成任意个实例,而单例模式只生成一个实例
我们先用单例模式设计一个Rectangle类
然后用__new__方法设计单例模式 , 代码如下
然后我们来验证下,单例模式下是否只能生成一个实例
单例模式在程序设计中比较典型的应用场景:多个用户同时调用某个模块时,会生成一些日志 , 我们希望这些日志存在同一个文件内,而不是多个文件 。
在生成日志模块我们就可以采用单例模式进行设计 。
二 。反射
概念:简单来说就是可以利用字符串来映射模块中的相应方法然后可以操作模块中相应的方法
我们以一个饭店点菜的实际场景来理解Python的反射机制
hasatter(对象,属性或方法名)
判断对象中是否有某个属性或某个方法,返回值是布尔型
getattr(对象,属性或方法名,缺省值) 判断对象中是否有某个属性或某个方法 , 如果有返回方法本身,没有则返回缺省值
setattr(对象,属性,新值)
将实例的属性改为新的值,如果属性不存在则新建
我们给实例guke1加个价格属性
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)

推荐阅读