单例模式的概念
单例模式主要目的是确保某一个类只有一个实例存在。
比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 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中注册这些类,在后台就能对创建的表进行管理
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
''' 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 '''
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
''' 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) '''
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 # 设置为复数形式