zoukankan      html  css  js  c++  java
  • 单例模式和配置admin

                     单例模式的概念              

    单例模式主要目的是确保某一个类只有一个实例存在。
    比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。
    如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。
    事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

    python中实现单例模式的方法:
    1.使用__new__
    2.使用模块
    3.使用装饰器
    4.使用元类

    class Person():
        def __init__(self,name,age):
            self.name=name
            self.age=age
    alex=Person("alex",18)
    jerd=Person("jerd",18)
    print(id(Person),id(alex),id(jerd))
    1855204438680 1855238470960 1855238471072
    在内存中有三块地址,一块存放着类Person的信息,一块存这alex这个对象的信息,一块存这jerd这个对象的信息
    在Person这个类中,每实例化一个对象,就会创建一个新的地址。而单例模式要做的就是,不管创建多少个对象,所有的对象均指向同一块地址

    1.使用__new__

    class Singleton(object):
        __instance=None
        def __new__(cls, *args, **kwargs):
            if not cls.__instance:
                cls.__instance=super(Singleton,cls).__new__(cls,*args,**kwargs)
            return cls.__instance
    class Myclass(Singleton):
        a=1
    obj1=Myclass()
    obj2=Myclass()
    print(obj1,id(obj1)) #<__main__.Myclass object at 0x000001A786801048> 1819027705928
    print(obj2,id(obj2)) #<__main__.Myclass object at 0x000001A786801048> 1819027705928
    实例化时先执行new方法,在执行init方法.两个对象的内存地址相同,无论在创建多少个,所有的对象均指向同一内存地址

    2.使用模块

    Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
    import 只要引入文件,只加载一次,第二次引入后不执行,直接拿第一次渠道的结果
    '''
    # 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))
    '''

    引用1:

    from mysingleton import my_singleton
    print(id(my_singleton))
    from mysingleton import my_singleton as my_singleton_new
    print(id(my_singleton_new))
    ##在第一次执行时,先加载mysingleton这个文件,然后执行my_singleton,生成一个对象地址,
    #第二次执行时,就不再加载mysingleton文件,取到第一次生成的对象地址

    引用2:

    import func
    func.bar()
    第一次引入func就执行func中的内容,func中的from mysingleton import my_singleton已经执行过,生成了mysingleton对象
    func.bar在取值时,只能取到已经生成的mysingleton对象

    引用3:

    from mysingleton import my_singleton,My_Singleton
    mn1=My_Singleton
    ms1=My_Singleton()
    from mysingleton import my_singleton,My_Singleton
    mn2=My_Singleton
    ms2=My_Singleton()
    print(id(ms1))
    print(id(ms2))
    print(id(mn1)) #1707140026296
    print(id(mn2)) #1707140026296
    print(id(ms1)) #1707173772984
    print(id(ms2)) #1707173773040
    ##在第一次执行时,先加载mysingleton这个文件,然后执行my_singleton和My_Singleton,分别生成一个对象地址和类地址
    ##第二次执行时,就不再加载mysingleton文件,分别取到第一次生成的对象地址和空间地址,但是相同的类地址在实例化时,生成不同地址的对象

                             配置admin                      

    1.在setting中配置,Django已经配置

    INSTALLED_APPS = [
        'django.contrib.admin',  #//admin配置
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        "app01"
    ]

    2.在urls中配置admin路由

    from django.conf.urls import url
    from django.contrib import admin
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
    ]

    3.创建超级用户,登陆admin

    python manage.py createsuperuser 在127.0.0.1:8000/admin/登陆

    4.在models中创建类orm,并在admin.py中注册这些类,在后台就能对创建的表进行管理

    '''
    from django.db import models
    # Create your models here.
    class Book(models.Model):
        title=models.CharField(max_length=255)
        price=models.IntegerField()
        publisher=models.ForeignKey(to="Publisher")
        authors=models.ManyToManyField(to='Userinfo')
        def __str__(self):
            return title
    class Publisher(models.Model):
        title=models.CharField(max_length=255)
        addr=models.CharField(max_length=255)
        def __str__(self):
            return title
    class Userinfo(models.Model):
        name=models.CharField(max_length=255)
        age=models.IntegerField()
        phone=models.BigIntegerField()
        def __str__(self):
            return name
    '''
    models.py
    '''
    from django.contrib import admin
    # Register your models here.
    from MY_Blog import models
    admin.site.register(models.Book)
    admin.site.register(models.Publisher)
    admin.site.register(models.Userinfo)
    
    '''
    admin.py

    5.admin处理

    admin model:
        对每一个app下的model设计出增伤改查4个url
            查看book:
            http://127.0.0.1:8000/admin/app01/book/
            添加book: 
            http://127.0.0.1:8000/admin/app01/book/add/    
            编辑book:
            http://127.0.0.1:8000/admin/app01/book/1/change/
            删除book:
            http://127.0.0.1:8000/admin/app01/book/1/delete/

                    自定义admin             

    1.自定义admin内容

    from django.contrib import admin
    # Register your models here.
    from MY_Blog import models
    from django.utils.safestring import mark_safe
    #以图书设置为示例:
    class Custom_book(admin.ModelAdmin):
        def deletes(self):
            return mark_safe("<a href=''>删除</a>") #不添加safe属性,会把标签显示出来
        #1.自定义admin显示的字段。多对多的字段不能加,否则报错
        # list_display = ["title","price","publisher",]
        #2.指定特定字段进入编辑
        list_display_links = ["title","price"]
        #3.在admin中添加新字段,在类中定义一个方法,返回响应字段
        list_display = ["title", "price", "publisher",deletes ]
        #4.根据字段进行分类,在页面右侧出现filter区
        list_filter=["price","title","authors","publisher"]
        #5.搜素框,根据定义的字段进行搜素,模糊查找
        search_fields = ["title", "price"]
        #6.更改页面
        # change_list_template="list.html" 基本不用
        #7.在编辑时,只能对定义的字段编辑
        # fields = ('title',)
        #8.批处理
        def patch_init(self,request,queryset):
            queryset.update(price=100) #对价格进行更改
        patch_init.short_description = "批量初始化"
        actions = [patch_init, ]
    admin.site.register(models.Book,Custom_book)
    admin.site.register(models.Publisher)
    admin.site.register(models.Userinfo)

    2.自定义admin显示中文

    #1.将Django自身内容设置为中文
    在setting.py中修改LANGUAGE_CODE ='zh-hans'
    #2.给创建的表名和字段起别名(中文显示),在models中给表加verbose_name属性
    class Book(models.Model):
        title=models.CharField(max_length=255 ,verbose_name="题目" )
        price=models.IntegerField(verbose_name='价格')
        publisher=models.ForeignKey(to="Publisher",verbose_name='出版社')
        authors=models.ManyToManyField(to='Userinfo',verbose_name='作者')
        def __str__(self):
            return self.title
    class Meta:  #对表名操作
        verbose_name = "图书信息"  # 给表起别名。默认会加s
        verbose_name_plural = verbose_name  # 设置为复数形式
     
     
  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/zgf-666/p/9119246.html
Copyright © 2011-2022 走看看