开发stark组件

本文详细介绍如何模仿Django的内置Admin组件,开发一个自定义的Stark组件。重点讲解了单例模式的应用、路由二级分发的实现及前端页面展示自定义样式的实践。

项目要求:

    模仿django自带的admin组件,开发一套属于我们自己的start组件

今日项目重点:

      重点一:单例模式,需要理解基于模块的单例模式具体是怎么回事,及其作用

      重点二:路由的二级分发

      重点三:对于self什么情况指的是理解

 

首先,我们先来说一下基于模块的单例模式,

单例顾名思义就是只有一个实例 

我们现在一个py文件里定义好如下的类

class F:
    def __init__(self,name):
        self.name=name


    def sname(self):
        print(self.name)


f=F('alex')
print('ok')

然后在另一个py文件中导入我们实例化的对象小f

from 基础知识.a import f

print(id(f))

from 基础知识.a import f

print(id(f))

#输出结果
#ok #
1845270931384 #1845270931384

我们明明导入了两次模块 为啥只打印出一个ok呐 因为这是python独有的一个机制 它会把第一次导入的模块 保存到一个地方 如果下面还导入模块 并不会使用 而是从第一个那拿 我们所需要的

但是,如果导入的是大F,那就相当于重新实例化得到一个新的对象 而每一个对象都有属于自己的一块内存空间

from 基础知识.a import F

print(id(F('alex')))

print(id(F('alex')))

#输出结果
# ok
# 3024850486216
# 3024850485320

如果对类与对象的内存不是很清楚 可以看下图

路由的二级分发:

首先来介绍一个路由分发的一个标准([],None,None)列表中 放分发的路由,第一个None是,,,第二个None指的是app暂时用不到 我们先用None来代替

二级路由分发的最基本的方式:

这么写的话 路由分发少的时候 还好 如果路由分发很多的时候 就会很乱 所以我们可以用下列方法代替

self:

  在我们看源码去封装一个功能或者理解源码是什么意思的时候 我们一定要注意一个问题 那就是self到底指的是哪个对象

  只有确定了这一点才能继续往走 self所代表的对象不同 整个类所要做的事当然也就不同 就向我们之前所说的 每个类的实例化对象

  即使实例化的值是一样的但是还是完全不同的两个对象

 

下面开始我们的项目:

 首先第一步 我们要先重新建一个django项目,

 

然后在命令行里 重新创建一个项目用来写我们自定义的stark组件的源代码

然后在app01下加入stark

接下来就需要我们进去配置文件中将stark配置成项目启动 stark也会跟着启动

然后将stark中的app里加一个启动文件

 

接下来我们测试一下,在app01下的stark.py文件中加print("ok")然后启动django项目看看 会不会直接打印ok

 

测试成功 说明我们的准备工作已经做好

先在stark文件下建一个service的包 ,并在里面创建一个stark.py

然后在url里导入 跟admin一样做成一个方法 项目启动就可以执行 项目启动就能执行

 

然后我们再去导入的文件里写我们自定义的源码

class ModelStark():
    def __init__(self,model):
        self.model = model


class StarkSite(object):

    def __init__(self):
        self._registry = {}

    def register(self, model, admin_class=None, **options):

        if not admin_class:
            admin_class = ModelStark


        self._registry[model] = admin_class(model, self)



site = StarkSite()

这就是个单例生成的对象都是相同的所以所占的把内存空间都是相同 那_register字典里的值不会重置,只要生成一个对象就会添加一对键值对 这就是单例的好处

接下来我们需要写路由分发

 

class StarkSite(object):

    def __init__(self):
        self._registry = {}

    def register(self, model, admin_class=None, **options):

        if not admin_class:
            admin_class = ModelStark


        self._registry[model] = admin_class(model)

    def get_urls(self):

        temp = [

        ]

        for model_class, config_obj in self._registry.items():
            print("===>", model_class, config_obj)

            model_name = model_class._meta.model_name
            app_label = model_class._meta.app_label
            print("===>", app_label, model_name)

            temp.append(url(r'^%s/%s/' % (app_label, model_name), config_obj.urls))

        '''
        创建url:

            url("app01/book/$",self.list_view),
            url("app01/book/add$",self.add_view),
            url("app01/book/(\d+)/change/$",self.change_view),
            url("app01/book/(\d+)/delete/$",self.delete_view),



            url("app01/publish/$",self.list_view),
            url("app01/publish/add$",self.add_view),
            url("app01/publish/(\d+)/change/$",self.change_view),
            url("app01/publish/(\d+)/delete/$",self.delete_view),





        '''

        return temp

    @property
    def urls(self):

        return self.get_urls(), None, None

site = StarkSite()

 因为我们将urls封装成属性 所以我们可以在url中 直接加点调用一个函数

 

 

 这里要声明一个问题,如果按照下面的写法,会出现一个问题

class StarkSite(object):

    def __init__(self):
        self._registry = {}

    def register(self, model, admin_class=None, **options):

        if not admin_class:
            admin_class = ModelStark


        self._registry[model] = admin_class(model)
        
    
    def add_view(self, request):
        return HttpResponse("add_view")

    def change_view(self, request,id):
        return HttpResponse("change_view")

    def delete_view(self, request,id):
        return HttpResponse("delete_view")


    def get_urls(self):


        temp=[
            url("^$",self.list_view),
            url("^add/$",self.add_view),
            url("^(\d+)/change_view/$",self.change_view),
            url("^(\d+)/delete_view$",self.delete_view),

        ]

        return temp


    @property
    def urls(self):


        return self.get_urls(),None,None

    def get_urls1(self):

        temp = [

        ]

        for model_class, config_obj in self._registry.items():
            print("===>", model_class, config_obj)

            model_name = model_class._meta.model_name
            app_label = model_class._meta.app_label
            print("===>", app_label, model_name)

            temp.append(url(r'^%s/%s/' % (app_label, model_name), config_obj.urls))

        '''
        创建url:

            url("app01/book/$",self.list_view),
            url("app01/book/add$",self.add_view),
            url("app01/book/(\d+)/change/$",self.change_view),
            url("app01/book/(\d+)/delete/$",self.delete_view),



            url("app01/publish/$",self.list_view),
            url("app01/publish/add$",self.add_view),
            url("app01/publish/(\d+)/change/$",self.change_view),
            url("app01/publish/(\d+)/delete/$",self.delete_view),





        '''

        return temp

    @property
    def urls(self):

        return self.get_urls1(), None, None

site = StarkSite()

 

因为site = StarkSite()是单例所以会导致不管谁来调用self都是相同的  这就会导致所有的页面的样式都会是相同的 ,这就违背了 我们要写的组件 我们要写的组件就是为了可实现,页面可以自定义

以下就是完整的路由分发

from django.conf.urls import url

from django.shortcuts import HttpResponse,redirect,render

class ModelStark():
    def __init__(self,model):
        self.model = model


    def list_view(self,request):


        #用户访问的模型表:  self.model
        print("self.model:",self.model)


        print("self.list_display",self.list_display)


        queryset=self.model.objects.all()



        return render(request,"stark/list_view.html",{'queryset':queryset})

    def add_view(self, request):
        return HttpResponse("add_view")

    def change_view(self, request,id):
        return HttpResponse("change_view")

    def delete_view(self, request,id):
        return HttpResponse("delete_view")


    def get_urls(self):


        temp=[
            url("^$",self.list_view),
            url("^add/$",self.add_view),
            url("^(\d+)/change_view/$",self.change_view),
            url("^(\d+)/delete_view$",self.delete_view),

        ]

        return temp


    @property
    def urls(self):


        return self.get_urls(),None,None


class StarkSite(object):

    def __init__(self):
        self._registry = {}

    def register(self, model, admin_class=None, **options):

        if not admin_class:
            admin_class = ModelStark


        self._registry[model] = admin_class(model)



    def get_urls1(self):

        temp = [

        ]

        for model_class, config_obj in self._registry.items():
            print("===>", model_class, config_obj)

            model_name = model_class._meta.model_name
            app_label = model_class._meta.app_label
            print("===>", app_label, model_name)

            temp.append(url(r'^%s/%s/' % (app_label, model_name), config_obj.urls))

        '''
        创建url:

            url("app01/book/$",self.list_view),
            url("app01/book/add$",self.add_view),
            url("app01/book/(\d+)/change/$",self.change_view),
            url("app01/book/(\d+)/delete/$",self.delete_view),



            url("app01/publish/$",self.list_view),
            url("app01/publish/add$",self.add_view),
            url("app01/publish/(\d+)/change/$",self.change_view),
            url("app01/publish/(\d+)/delete/$",self.delete_view),





        '''

        return temp

    @property
    def urls(self):

        return self.get_urls1(), None, None

site = StarkSite()

但是我们还会遇到一个问题:前端页面传值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

<h3>数据展示</h3>

<ul>
    {% for item in queryset %}
    <li>{{ item }}</li>
    {% endfor %}

</ul>

</body>
</html>

 这就需要我们告诉前端页面需要打印什么字段

这就用到自定义

from app01 import models

from stark.service.strak import site,ModelStark


class BookConfig(ModelStark):
    list_display = ["title","price"]

site.register(models.Book,BookConfig)

site.register(models.Publish)
site.register(models.Author)
site.register(models.AuthorDetail)

自定义样式如何在前端页面展示 我们下个博客更新

还有一点 本文并没有写models 不过建表就需要自己动手了

 

转载于:https://www.cnblogs.com/yftzw/p/9342738.html

卷积神经网络(CNN)是针对多维网格数据(如图像、视频)设计的深度学习架构,其结构灵感来源于生物视觉系统对信息的分层处理机制。该模型通过局部连接、参数共享、层级特征提取等策略,有效捕获数据中的空间模式。以下从结构特性、工作机制及应用维度展开说明: **1. 局部连接与卷积运算** 卷积层利用可学习的多维滤波器对输入进行扫描,每个滤波器仅作用于输入的一个有限邻域(称为感受野),通过线性加权与非线性变换提取局部特征。这种设计使网络能够聚焦于相邻像素间的关联性,从而识别如边缘走向、色彩渐变等基础视觉模式。 **2. 参数共享机制** 同一卷积核在输入数据的整个空间范围内保持参数不变,大幅降低模型复杂度。这种设计赋予模型对平移变换的适应性:无论目标特征出现在图像的任何区域,均可由相同核函数检测,体现了特征位置无关性的建模思想。 **3. 特征降维与空间鲁棒性** 池化层通过对局部区域进行聚合运算(如取最大值或均值)实现特征降维,在保留显著特征的同时提升模型对微小形变的容忍度。这种操作既减少了计算负荷,又增强了特征的几何不变性。 **4. 层级特征抽象体系** 深度CNN通过堆叠多个卷积-池化层构建特征提取金字塔。浅层网络捕获点线面等基础模式,中层网络组合形成纹理部件,深层网络则合成具有语义意义的对象轮廓。这种逐级递进的特征表达机制实现了从像素级信息到概念化表示的自动演进。 **5. 非线性扩展与泛化控制** 通过激活函数(如ReLU及其变体)引入非线性变换,使网络能够拟合复杂决策曲面。为防止过拟合,常采用权重归一化、随机神经元失活等技术约束模型容量,提升在未知数据上的表现稳定性。 **6. 典型应用场景** - 视觉内容分类:对图像中的主体进行类别判定 - 实例定位与识别:在复杂场景中标定特定目标的边界框及类别 - 像素级语义解析:对图像每个像素点进行语义标注 - 生物特征认证:基于面部特征的个体身份鉴别 - 医学图像判读:辅助病灶定位与病理分析 - 结构化文本处理:与循环神经网络结合处理序列标注任务 **7. 技术演进脉络** 早期理论雏形形成于1980年代,随着并行计算设备的发展与大规模标注数据的出现,先后涌现出LeNet、AlexNet、VGG、ResNet等里程碑式架构。现代研究聚焦于注意力分配、跨层连接、卷积分解等方向,持续推动模型性能边界。 卷积神经网络通过其特有的空间特征提取范式,建立了从原始信号到高级语义表达的映射通路,已成为处理几何结构数据的标准框架,在工业界与学术界均展现出重要价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
屋顶面板实例分割数据集 一、数据集基础信息 • 数据集名称:屋顶面板实例分割数据集 • 图片数量: 训练集:1559张图片 验证集:152张图片 测试集:95张图片 总计:1806张图片 • 训练集:1559张图片 • 验证集:152张图片 • 测试集:95张图片 • 总计:1806张图片 • 分类类别: panel(面板):屋顶上的面板结构,如太阳能板或其他安装组件。 roof(屋顶):建筑屋顶区域,用于定位和分割。 • panel(面板):屋顶上的面板结构,如太阳能板或其他安装组件。 • roof(屋顶):建筑屋顶区域,用于定位和分割。 • 标注格式:YOLO格式,包含实例分割的多边形标注,适用于实例分割任务。 • 数据格式:图片文件,来源于航拍或建筑图像,涵盖多种场景。 二、数据集适用场景 • 建筑与施工检查:用于自动检测和分割屋顶上的面板,辅助建筑质量评估、维护和安装规划。 • 可再生能源管理:在太阳能发电系统中,识别屋顶太阳能板的位置和轮廓,优化能源部署和监控。 • 航拍图像分析:支持从空中图像中提取建筑屋顶信息,应用于城市规划、房地产评估和基础设施管理。 • 计算机视觉研究:为实例分割算法提供基准数据,推动AI在建筑和能源领域的创新应用。 三、数据集优势 • 精准实例分割标注:每个面板和屋顶实例均通过多边形标注精确定义轮廓,确保分割边界准确,支持细粒度分析。 • 类别聚焦与实用性:专注于屋顶和面板两个关键类别,数据针对性强,直接适用于建筑和能源行业的实际需求。 • 数据多样性与泛化性:涵盖不同环境下的屋顶和面板图像,增强模型在多变场景中的适应能力。 • 任务适配便捷:标注兼容主流深度学习框架(如YOLO),可快速集成到实例分割模型训练流程。 • 行业价值突出:助力自动化检测系统开发,提升建筑检查、能源管理和城市分析的效率与准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值