单例模式和配置admin[通俗易懂]

单例模式和配置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中注册这些类,在后台就能对创建的表进行管理

单例模式和配置admin[通俗易懂]
单例模式和配置admin[通俗易懂]

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

单例模式和配置admin[通俗易懂]
单例模式和配置admin[通俗易懂]

'''
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  # 设置为复数形式

 

 

 

 

转载于:https://www.cnblogs.com/zgf-666/p/9119246.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107488.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 安装vmware一直报缺少dll_vmware安装问题

    安装vmware一直报缺少dll_vmware安装问题MicrosoftRuntimeDLL安装程序未能完成安装不要说什么去打开%temp%,治标不治本,如果后面无法输入密钥的话,两个问题堆在一起根本解决不了。MicrosoftRuntimeDLL安装程序未能完成安装:这个问题的最直接解决办法是服务没打开,打开控制面板-管理工具-服务确认以下两个服务是打开的:WindowsInstaller;WindowsModulesInst…

  • shell中 -eq,-ne,-gt,-lt,-ge,-le数字比较符

    使用说明:-eq//equals等于-ne//noequals不等于-qt//qreaterthan大于-lt//lessthan小于-ge//greaterequals大于等于-le//lessequals小于等于注:1、在shell中进行比较时,结果为0代表真,为1代表假。2、-eq,-ne等比较符只能用于数字比较,有字符也会先转换成数字然后进行比较。…

  • 卸载奇安信天擎,流氓软件怎么卸载_奇安信和360天擎

    卸载奇安信天擎,流氓软件怎么卸载_奇安信和360天擎奇安信天擎,很多朋友应该都不陌生,现在很多公司都要求每个员工的电脑上必须安装奇安信天擎这个软件,尤其是稍微大一点的公司,数据需要保密或容易被攻击的公司,奇安信可以有效的防御这些攻击。看到这是不是有朋友在想这不是一个很好的防御软件吗,为什么说是流氓软件呢?这个软件之所以叫它流氓软件,是因为这个软件一旦安装,既无法退出也无法卸载,有些朋友现在会想,这个软件就放那放着就好了啊,反正是防御的软件,我只能说你还没有了解奇安信的缺点。奇安信与一切杀毒软件冲突,公司要求安装奇安信,你就要把电脑之前的杀毒软件卸载,这

  • nginx 转发_nginx转发文件流

    nginx 转发_nginx转发文件流前后分离模式减少域名寻址时间,直接走静态html文件的域名请求,服务器做转发location/api/{proxy_passhttp://api.domain.com;#http://api.domain.com/api/}location/api/{proxy_passhttp://api.domain.com/;http://api.domain.com/}hosts127.0.0.1api.domain.com

    2022年10月19日
  • 新建移动apn让网速变快(移动apn接入点哪个快)

    4G网络可以给我们带来畅快的网速体验,其实我们目前使用的LTE网络根据网速还分为多个标准,标准对4G网络的支持也不太一样,但是有时我们任然可以感觉到在有4G基站的地方上网网速也不是那么的满意,这是怎么回事儿呢?TD-LTE和FDD-LTE尽管被宣传为4G无线标准,但它其实并未被3GPP认可为国际电信联盟所描述的下一代无线通讯标准IMT-Advanced,因此在严格意义上其还未达到4G的标准。APN…

  • propertydescriptor类的使用_constructor类

    propertydescriptor类的使用_constructor类.NETFramework2.0其他版本提供类上的属性的抽象化。命名空间:System.ComponentModel程序集:System(在system.dll中)语法C#C++VB[ComVisibleAt

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号