版权声明:本人原创作品,受国家法律保护,未经许可,任何单位及个人不得做营利性使用;若仅做个人欣赏、交流等非营利性使用,应当指明作者姓名、作品名称,并且不得侵犯本人依法享有的其他权利。出处为☞ https://blog.csdn.net/aa1209551258/article/details/82458868
☯话不多提,单例的用处大家都知道.☯
上单例
方式一:
✿经典的重写__new__
方法实现单例✿
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
方式二:
✿使用元类type
实现单例✿
class Singleton(type):
def __init__(cls, *args, **kwargs):
cls.__instance = None
super(Singleton, cls).__init__(*args, **kwargs)
def __call__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls.__instance
class UseClass(metaclass=Singleton): # metaclass= 为 python3的写法
# __metaclass__ = Singleton # __metaclass__ 为 python2的写法
pass
方式三:
✿装饰器
方式实现单例✿
def singleton(cls, *args, **kwargs):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _singleton
@singleton
class UseClass(object):
pass
✿附: 以上三种的校验.✿
if __name__ == '__main__':
s1 = UseClass()
s2 = UseClass()
print(id(s1)) # 140365945542080
print(id(s2)) # 140365945542080
print(s1 == s2) # True
print(s1 is s2) # True
方式四:
✿导入
创建好的对象✿
# a.py
class UseClass(object): # 在a.py中创建好要成为单例的对象.
pass
uc = UseClass()
# b.py
from a import uc # 导入已经a中已经创建好的对象
print(id(uc))
# c.py
from a import uc # 导入已经a中已经创建好的对象
print(id(uc))
(这个看看玩就行啦.)
扩展实现???what??黑人问号???:
✿两个对象使用同一个__dict__
(目前没发现有什么特别的用处…)✿
class Singleton(object):
_state = {}
def __new__(cls, *args, **kwargs):
obj = super(Singleton, cls).__new__(cls, *args, **kwargs)
obj.__dict__ = obj._state
return obj
class UseClass(Singleton):
pass
uc1 = UseClass()
uc2 = UseClass()
print(id(uc1)) # 140520618571536
print(id(uc2)) # 140520618595384
print(id(uc1) == id(uc2)) # False
print(uc1.__dict__) # {}
print(uc2.__dict__) # {}
print(id(uc1.__dict__) == id(uc2.__dict__)) # True
!!!版权声明!!!
本系列为博主学心得与体会,所有内容均为原创(✿◡‿◡)
欢迎传播、复制、修改。引用、转载等请注明转载来源。感谢您的配合
用于商业目的,请与博主采取联系,并请与原书版权所有者联系,谢谢!\(≧▽≦)/
我的联系方式:email–> [email protected]
!!!版权声明!!!
生活嘛~ 最重要的就是开心喽~ O(∩_∩)O~~