写在前面

学究嘛,就记录一下;
实质全是根据设定一个标志位来完成, 通俗化的讲便是当第一次实例化时, 记录下"早已实例化了", 当再度实例化时, 将"记录"的详细地址回到;
题外话, 涵数它不香么? 还面向对象编程, 要什么目标.

1. 模块(module)

  • 这类方法无需做什么, 一切正常写code就可以了, 一旦这一模块被导进便会形成.pyc文件, 第二次导进时载入的便是.pyc

    # girl.py
    class GirlFriend:
        pass
    
    Lucy = GirlFriend()
    
    # me.py
    from girl import Lucy
    

2. 装饰器完成

  • 界定一个装饰器以下

    def singleton(cls):
        instances = {}
        @functools.wraps(cls)
        def _wrapper(*args, **kw):
            if cls not in instances:
                print('沒有该案例	,建立一个')
                instances[cls] = cls(*args, **kw)
            return instances[cls]
        return _wrapper
    
  • 应用装饰器

    @singleton
    class GirlFriend:
        pass
    

3.
装饰器使其

class Singleton:
    def __init__(self, cls):
        self._cls = cls
        self._instance = {}

    def __call__(self, *args):
        if self._cls not in self._instance:
            self._instance[self._cls] = self._cls(*args)
        return self._instance[self._cls]

# 用法
@Singleton
class GirlFriend:
    pass

4.
__new__
方式完成

class GirlFriend:

    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls)
        return cls._instance

# 用法
Lucy = GirlFriend()

5. 元类完成

class GirlFriend(type):
    def __new__(cls, name, bases, attrs):
        cls._instance = None
        return type.__new__(cls, name, bases, attrs)

    def __call__(cls, *args, **kw):
        if cls._instance is None:
            cls._instance = type.__call__(cls, *args, **kw)
        return cls._instance

# 用法
class Lucy(metaclass=GirlFriend):
    pass

汇总

  1. 装饰器完成非常简单, 也罢了解
文章来源于网络,如有侵权请联系站长QQ61910465删除
本文版权归趣快排营销www.seoguRubloG.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系✚Qq61910465