写在前面
学究嘛,就记录一下;
实质全是根据设定一个标志位来完成, 通俗化的讲便是当第一次实例化时, 记录下"早已实例化了", 当再度实例化时, 将"记录"的详细地址回到;
题外话, 涵数它不香么? 还面向对象编程, 要什么目标.
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
汇总
- 装饰器完成非常简单, 也罢了解