单例模式☞Singleton☞读作:斯英狗疼

版权声明:本人原创作品,受国家法律保护,未经许可,任何单位及个人不得做营利性使用;若仅做个人欣赏、交流等非营利性使用,应当指明作者姓名、作品名称,并且不得侵犯本人依法享有的其他权利。出处为☞ 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~~

这里写图片描述


猜你喜欢

转载自blog.csdn.net/aa1209551258/article/details/82458868