python设计模式之单例


理解:所谓单例,是指一个类的实例从始至终只能被创建一次。

 

method 1:使用__new__方法会很简单。Python中类是通过__new__来创建实例的

首先:

__new__() 方法的特性:

__new__() 方法是在类准备将自身实例化时调用。

__new__() 方法始终都是类的静态方法,即使没有被加上静态方法装饰器。

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

若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行。

#coding='utf-8'

class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'):
cls._instance = super().__new__(cls)
return cls._instance
if __name__ == '__main__':
class A(Singleton):
def __init__(self,s):
self.s = s

a = A('apple')
b = A('bannana')
print(id(a), a.s)
print(id(b), b.s)

print("***%%%%%****")

#python3
class Singleton(object):
__instance = None

def __new__(cls, *args, **kwargs):
if cls.__instance is None:
# cls.__instance = super().__new__(cls)
# cls.__instance = object.__new__(cls)
cls.__instance = super().__new__(cls)
return cls.__instance

def __init__(self, status_number):
self.status_number = status_number

test1 = Singleton("2")
print(id(test1),test1.status_number)

test2 = Singleton("3")
print(id(test2),test2.status_number)
class Foo(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super().__new__(cls)
return cls._instance
class A(Foo):
def __init__(self,s):
self.s = s
a = A('apple')
b = A('bannana')
print(id(a))
print(id(b))
# a = Foo()
# b = Foo()
# print(id(a)==id(b))
posted @ 2019-11-27 16:02  巍然~chelsea  阅读(124)  评论(0编辑  收藏  举报