/ 2019-04-09
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
单例模式在程序设计中非常的常见,一般来说,某些类,我们希望在程序运行期间有且只有一个实例,原因可能是该类的创建需要消耗系统过多的资源、花费很多的时间,或者业务上客观就要求了只能有一个实例。一个场景就是:我们的应用程序有一些配置文件,我们希望只在系统启动的时候读取这些配置文件,并将这些配置保存在内存中,以后在程序中使用这些配置文件信息的时候不必再重新读取。
在 Python 中,我们可以用多种方法来实现单例模式:
使用模块
使用 __new__
使用装饰器(decorator)
使用元类(metaclass)
class Singleton(object):
__instance = None
def __new__(cls,*args,**kwd):
if cls.__instance is None:
cls.__instance = object.__new__(cls,*args,**kwd)
return cls.__instance
# mysingleton.py
class My_Singleton(object):
def foo(self):
print("foo.....")
my_singleton = My_Singleton()
# func.py
from mysingleton import my_singleton
def bar():
print(id(my_singleton))
## main.py
# 单例模式方式2 :模块方式
# from mysingleton import my_singleton,My_Singleton
# 思考1
# from mysingleton import my_singleton as my_singleton_new
# print(id(my_singleton_new))
# print(id(my_singleton))
# 思考2
# from mysingleton import my_singleton,My_Singleton
# ms1=My_Singleton()
# from mysingleton import my_singleton,My_Singleton
# ms2=My_Singleton()
# print(id(ms1))
# print(id(ms2))
# 思考3
# import func
# func.bar()
# id(my_singleton)
<1> 循环加载执行所有已经注册的app中的admin.py文件
def autodiscover():
autodiscover_modules('admin', register_to=site)
<2> 注册模型
#admin.py
class BookAdmin(admin.ModelAdmin):
list_display = ("title",'publishDate', 'price')
admin.site.register(Book, BookAdmin)
admin.site.register(Publish)
注意: admin.site
这里应用的是一个基于模块的单例模式,执行的每一个app中的每一个admin.site都是一个对象
class ModelAdmin(BaseModelAdmin):
pass
class AdminSite(object):
def __init__(self, name='admin'):
self._registry = {}
def register(self, model_or_iterable, admin_class=None, **options):
if not admin_class:
admin_class = ModelAdmin
# Instantiate the admin class to save in the registry
self._registry[model] = admin_class(model, self)
<3> 设计URL
(0)