#! /usr/bin/env python
# -*- coding:utf-8 -*-
# 1.单例模式:所有对象封装的数据相同时
# 单例模式(Singleton Pattern)是一种常用的软件设计模式,
# 该模式的主要目的是确保某一个类只有一个实例存在。
# 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
# 比如,某个服务器程序的配置信息存放在一个文件中,
# 客户端通过一个 AppConfig 的类来读取配置文件的信息。
# 如果在程序运行期间,有很多地方都需要使用配置文件的内容,
# 也就是说,很多地方都需要创建 AppConfig 对象的实例,
# 这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,
# 尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,
# 我们希望在程序运行期间只存在一个实例对象。
#
# 在 Python 中,我们可以用多种方法来实现单例模式:
#
# 1.使用模块
# 其实,Python 的模块就是天然的单例模式,
# 因为模块在第一次导入时,会生成 .pyc 文件,当
# 第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
# 因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
# 2.使用 __new__
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:#如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
one = MyClass()
two = MyClass()
print(one == two,id(one),id(two))
# 3.使用装饰器(decorator)
#装饰器(decorator)可以动态地修改一个类或函数的功能
def deco1(func):
"""
装饰器方法,
:param func:被修饰函数
:return:返回计算结果
"""
list1={}
def _deco1(*args, **kwargs):
if func not in list1:
list1[func] = func(*args, **kwargs)
return list1[func]
return _deco1
#装饰方法
@deco1
def myfunc():
a = 1
myfunc()
#装饰类
@deco1
class MyClass2:
def __init__(self):
self.xx = 0
def getval(self):
return self.xx
def setval(self, val):
self.xx = val
a = MyClass2()
a.setval(2)
b = MyClass2()
print("b=", b.getval())
# 4.使用元类(metaclass)
# 元类就是用来创建类的“东西”。元类就是类的类。
# 函数type实际上是一个Python的内建元类。type就是Python在背后用来创建所有类的元类。
# 可以创建自己的元类:写一个类的时候为其添加__metaclass__属性
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
# Python2
# class MyClass(object):
# __metaclass__ = Singleton
# Python3
class MyClass(metaclass=Singleton):
def __init__(self):
self.xx = 0
def getval(self):
return self.xx
def setval(self, val):
self.xx = val