"""
单例模式 - 一个类只能创建出唯一的一个对象
无状态对象或对象状态是共享的 这样的对象通常可以设计为单例对象
"""
from functools import wraps
# 装饰类的装饰器 - 被装饰的不是函数而是一个类
# singleton函数中的instances虽然是一个局部变量
# 但是由于singleton函数返回的wrapper函数使用了该变量
# 所以它的生命周期会被延长(相当于是局部变量拥有了全局生命周期)
# 这种现象就称之为闭包(closure)
def singleton(cls):
instances = {}
@wraps(cls)
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
class A(object):
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = super().__new__(cls)
return cls.__instance
def __init__(self, name):
self.name = name
@singleton
class President(object):
def __init__(self, name, year):
self.name = name
self.year = year
def main():
s1 = A('王大锤')
s2 = A('白元芳')
print(s1.name)
print(s2.name)
print(s1 == s2)
print(id(s1))
print(id(s2))
President2 = President.__wrapped__
p1 = President2('奥巴马', 4)
p2 = President2('特朗普', 4)
print(p1 == p2)
print(p1.name, p2.name)
if __name__ == '__main__':
main()
单例
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...