#------------------------------------------------ 一 ----------------------------------------------------
"""
代码解释: class Singleton2中的__init__在MyClass2声明的时候被执行,MyClass2=Singleton2()
MyClass2()时,最先执行父类的__call__方法(object,Singleton2都作为MyClass2的父类,根据深度优先算法,会执行Singleton2中的__call__)
Singleton2中的__call__ 中书写了单例的逻辑.
"""
# class Singleton2(type):
# def __init__(self, name, bases, dict):
# print(self)
# print("sssss")
# super(Singleton2, self).__init__(name, bases, dict)
# self._instance = None
# def __call__(self, *args, **kwargs):
# print(self)
# if self._instance is None:
# self._instance = super(Singleton2, self).__call__(*args, **kwargs)
# return self._instance
#
#
# class MyClass2(object,metaclass=Singleton2):
# a = 1
#
# one = MyClass2()
# two = MyClass2()
#
# print (id(one)) # 31495472
#
# print (id(two)) # 31495472
#
# print (one == two) # True
#
# print (one is two) # True
#------------------------------------------------ 二 ----------------------------------------------------
# class Singleton(object):
# def __new__(cls, *args, **kwargs):
# if not hasattr(cls, ‘_instance‘):
# cls._instance = super().__new__(cls, *args, **kwargs)
# return cls._instance
#
#
# class MyClass(Singleton):
# a = 1
#
#
# one = MyClass()
# two = MyClass()
#
# # one和two完全相同,可以用id(), ==, is检测
# print (id(one))
# # 29097904
# print (id(two))
# # 29097904
# print (one == two)
# # True
# print (one is two )
# True
#------------------------------------------------ 三 ----------------------------------------------------
# def singleton(cls):
# instances = {}
#
# def _singleton(*args, **kwargs):
# if cls not in instances:
# instances[cls] = cls(*args, **kwargs)
# return instances[cls]
#
# return _singleton
#
#
# @singleton # MyClass3 = singleton(MyClass3)
# class MyClass3(object):
# a = 1
# def __init__(self,*args, **kwargs):
# pass
#
# one = MyClass3(3,4,5) # MyClass3:<function singleton.<locals>._singleton at 0x000000170E460D08>
# two = MyClass3(6,7,i=9)
#
# print (id(one))
# # 29660784
# print (id(two))
# # 29660784
# print (one == two)
# # True
# print (one is two)
# True
#------------------------------------------------ 三(自己练习) ----------------------------------------------------
def singleton(cls):
instances={}
def _singleton(*args,**kwargs):
if cls not in instances:
instances[cls]=cls(*args,**kwargs)
return instances[cls]
return _singleton
@singleton
class MyClass(object):
a = 1
def __init__(self,*args,**kwargs):
pass
a = MyClass(1,2)
b = MyClass(2,4,i=5)
print(id(a))
print(id(b))
#------------------------------------------------ 四,基于文件实现 ----------------------------------------------------
class XXX(object):
pass
xx = XXX() #---->这样别的地方从本模块直接导入xx,他们的id都是一样