老男孩IT教育,只培养技术精英

全国免费咨询电话:400-609-2893
stark组件之admin组件的源码解析 python面授班

    /    2019-04-09

admin组件的源码解析

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

单例模式在程序设计中非常的常见,一般来说,某些类,我们希望在程序运行期间有且只有一个实例,原因可能是该类的创建需要消耗系统过多的资源、花费很多的时间,或者业务上客观就要求了只能有一个实例。一个场景就是:我们的应用程序有一些配置文件,我们希望只在系统启动的时候读取这些配置文件,并将这些配置保存在内存中,以后在程序中使用这些配置文件信息的时候不必再重新读取。

在 Python 中,我们可以用多种方法来实现单例模式:

使用模块

使用 __new__

使用装饰器(decorator)

使用元类(metaclass)

基于 __new__的单例模式

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)

dmin执行流程

<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)

分享至