当前位置 : 主页 > 编程语言 > python >

python中单例设计模式

来源:互联网 收集:自由互联 发布时间:2022-06-18
一、关于​​__new__​​​和​​__init__​​方法 class A ( object ): def __init__ ( self ): print ( "这是 init 方法" ) def __new__ ( cls ): print ( "这是 new 方法" ) return object . __new__ ( cls ) A () # 这是 new 方


一、关于​​__new__​​​和​​__init__​​方法

class A(object):
def __init__(self):
print("这是 init 方法")

def __new__(cls):
print("这是 new 方法")
return object.__new__(cls)


A()
# 这是 new 方法
# 这是 init 方法
  • ​​__new__​​至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。
  • ​​__new__​​​必须要有返回值,返回实例化出来的实例,这点在自己实现​​__new__​​​时要特别注意,可以return父类​​__new__​​​出来的实例,或者直接是object的​​__new__​​出来的实例。
  • ​​__init__​​​有一个参数self,就是这个​​__new__​​​返回的实例,​​__init__​​​在​​__new__​​​的基础上可以完成一些其它初始化的动作,​​__init__​​不需要返回值。

二、单例设计模式

举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

class Singleton:
__instance = None # 类属性
__is_first = True

@classmethod
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
# 申请内存,创建一个对象,并把对象的类型设置为cls
cls.__instance = object.__new__(cls)

return cls.__instance

def __init__(self, a, b):
if self.__is_first:
self.a = a
self.b = b
self.__is_first = False


# 调用 __new__ 方法申请内存
# 如果不重写 __new__ 方法,会调用 object 的 __new__ 方法
# object的 __new__ 方法会申请内存
# 如果重写了 __new__ 方法,需要自己手动的申请内存
s1 = Singleton('呵呵', '嘿嘿嘿')
s2 = Singleton('哈哈', '嘻嘻嘻')
s3 = Singleton('嘎嘎', '嘤嘤嘤')

print(s1 is s2) # True
print(s1.a, s1.b) # 呵呵 嘿嘿嘿



上一篇:Python中的实例方法、类方法、静态方法
下一篇:没有了
网友评论