博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式和配置admin
阅读量:5115 次
发布时间:2019-06-13

本文共 5659 字,大约阅读时间需要 18 分钟。

 

                 单例模式的概念              

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

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

class Person():    def __init__(self,name,age):        self.name=name        self.age=agealex=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.__instanceclass Myclass(Singleton):    a=1obj1=Myclass()obj2=Myclass()print(obj1,id(obj1)) #<__main__.Myclass object at 0x000001A786801048> 1819027705928print(obj2,id(obj2)) #<__main__.Myclass object at 0x000001A786801048> 1819027705928
实例化时先执行new方法,在执行init方法.两个对象的内存地址相同,无论在创建多少个,所有的对象均指向同一内存地址

2.使用模块

Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。 import 只要引入文件,只加载一次,第二次引入后不执行,直接拿第一次渠道的结果
'''# mysingleton.pyclass My_Singleton(object):    def foo(self):        print("foo.....")my_singleton = My_Singleton()#func.pyfrom mysingleton import my_singletondef bar():    print(id(my_singleton))'''

引用1:

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

引用2:

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

引用3:

from mysingleton import my_singleton,My_Singletonmn1=My_Singletonms1=My_Singleton()from mysingleton import my_singleton,My_Singletonmn2=My_Singletonms2=My_Singleton()print(id(ms1))print(id(ms2))print(id(mn1)) #1707140026296print(id(mn2)) #1707140026296print(id(ms1)) #1707173772984print(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 urlfrom django.contrib import adminurlpatterns = [    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 titleclass Publisher(models.Model):    title=models.CharField(max_length=255)    addr=models.CharField(max_length=255)    def __str__(self):        return titleclass 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 modelsadmin.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 modelsfrom django.utils.safestring import mark_safe#以图书设置为示例:class Custom_book(admin.ModelAdmin):    def deletes(self):        return mark_safe("删除") #不添加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.titleclass Meta:  #对表名操作    verbose_name = "图书信息"  # 给表起别名。默认会加s    verbose_name_plural = verbose_name  # 设置为复数形式

 

转载于:https://www.cnblogs.com/FWF1944/p/10878184.html

你可能感兴趣的文章
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>
第23月第24天 git命令 .git-credentials git rm --cached git stash clear
查看>>
java SE :标准输入/输出
查看>>
一些方便系统诊断的bash函数
查看>>
jquery中ajax返回值无法传递到上层函数
查看>>
css3之transform-origin
查看>>
[转]JavaScript快速检测浏览器对CSS3特性的支持
查看>>
Master选举原理
查看>>
[ JAVA编程 ] double类型计算精度丢失问题及解决方法
查看>>