Python笔记11-闭包、装饰器和设计模式

文章目录

  • 闭包
  • 装饰器
  • 设计模式

闭包

在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。

示例

def outer(logo):def inner(msg):#logo="<"+logo+">"  会报错 表示不认识 logononlocal logo  #如果要修改 外部函数的值必须使用nonlocal修饰logo="<"+logo+">"#print(f"<{logo}>{msg}<{logo}>")print(f"{logo}{msg}{logo}")return innerfn=outer("mytest")
fn("你好")  #<mytest>你好<mytest>

需要使用nonlocal关键字修饰外部函数的变量才可在内部函数中修改它

优点,使用闭包可以让我们得到:
无需定义全局变量即可实现通过函数,持续的访问、修改某个值
闭包使用的变量的所用于在函数内,难以被错误的调用修改

缺点:
由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存

装饰器

装饰器其实也是一种闭包, 其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能

如我们希望给sleep函数,增加一个功能:
在调用sleep前输出:我要睡觉了
在调用sleep后输出:我起床了

def sleep():import randomimport timeprint("睡眠中.....")time.sleep(random.randint(1,3))
sleep()

可以借助闭包的功能
定义一个闭包函数, 在闭包函数内部:
执行目标函数
同时添加想要的功能

def sleep():import randomimport timeprint("睡眠中.....")time.sleep(random.randint(1,3))def outer(func):def inner():#print(f"<{logo}>{msg}<{logo}>")print(f"我要睡觉了...")func()print(f"我要起床了...")return innerfn = outer(sleep)
fn()

装饰器的语法糖:可以使用注解的方式来使用闭包

def outer2(func):def inner2():#print(f"<{logo}>{msg}<{logo}>")print(f"我要睡觉了...")func()print(f"我要起床了...")return inner2
@outer2   # 增加注解
def sleep():import randomimport timeprint("睡眠中.....")time.sleep(random.randint(1,3))
sleep()

设计模式

设计模式是一种编程套路,可以极大的方便程序的开发。
最常见、最经典的设计模式,就是我们所学习的面向对象了。
除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模式:
单例、工厂模式、 建造者、责任链、状态、备忘录、解释器、访问者、观察者、中介、模板、代理模式等等模式
这里我挑选了2个经常用到的单例、工厂模式进行了解。

单例模式
某些场景下, 我们需要一个类无论获取多少次类对象,都仅仅提供一个具体的实例
用以节省创建类对象的开销和内存开销
比如某些工具类,仅需要1个实例,即可在各处使用,这就是单例模式所要实现的效果

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。
在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
定义: 保证一个类只有一个实例,并提供一个访问它的全局访问点
适用场景:当一个类只能有一个实例,而客户可以从一个众所周知的访问点访问它时。

实现方式:
1.在一个文件中定义类并创建对象

class StrUtil:passstr_util = StrUtil()

2.另一个文件中直接导入对象使用

from imp_file import str_util
sutil1 = str_util
sutil2 = str_util
print(sutil2)#<imp_file.StrUtil object at 0x000001A13030A050>
print(sutil1)#<imp_file.StrUtil object at 0x000001A13030A050>

工厂模式
当需要大量创建一个类的实例的时候, 可以使用工厂模式。
即,基于工厂提供的方法去创建对象,可以太容易控制对象创建逻辑。
一般情况下创建对象:

class Person:pass
class Worker(Person):pass
class Student(Person):pass
class Teacher(Person):pass
worker = Worker()
stu = Student()
teacher = Teacher()

工厂模式创建对象:

class Person:pass
class Worker(Person):pass
class Student(Person):pass
class Teacher(Person):pass
class Factory:def get_person(self,p_type):if p_type=='w':return Worker()if p_type=='s':return Student()else:return Teacher()factory = Factory()
worker = factory.get_person('w' )
stu = factory.get_person('s')
teacher = factory.get_person('t')

使用工厂类的get_person()方法去创建具体的类对象
优点:
大批量创建对象的时候有统一的入口,易于代码维护,当需要修改创建逻辑时,仅修改工厂类的创建方法即可
符合现实世界的模式,即由工厂来制作产品(对象)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】网络模型

前言 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对存储系统&#xff0c;广泛用于各种网络应用中作为数据库、缓存和消息代理。Redis的网络模型是其高性能的关键因素之一&#xff0c;它涉及到多个方面&#xff0c;包括内存管理、事件处理、…

MySQL:提示:The server quit without updating PID file问题的解决办法

[rootizuf62598fraqjv0qztcczxz ~]# service mysql restart MySQL server PID file could not be found![失败] Starting MySQL...The server quit without updating PID file (/usr/local/mysql/data/snsgou.pid).[失败] 具体什么原因最好的办法是先查看下错误日志&#xff1…

数灵通可以让抖音跳转企业微信并回传

抖音作为一款热门的短视频应用&#xff0c;吸引了大量用户的关注和参与。 对于企业而言&#xff0c;如何有效地将其他平台的客户引入企业微信成为了一个重要的课题。本文以利用抖音渠道进行引流&#xff0c;跳转到企业微信为例&#xff0c;介绍一种高效的方法。 在抖音上直接…

Dart/Flutter工具模块:the_utils

Flutter笔记 Dart/Flutter工具模块&#xff1a;the_utils 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/detail…

java基础内容

1.聊一聊Java平台的理解&#xff01; java本身是一种面向对象的语言&#xff0c;最显著的特性有两个方面&#xff1a;一是书写一次&#xff0c;到处运行&#xff0c;也就是跨平台的特性&#xff1b;另外就是垃圾回收机制&#xff1a;java通过垃圾收集器回收分配内存&#xff0…

WPF多值转换器

背景&#xff1a;实现Slider拖动可以调整rgb 单转换器&#xff1a;WPF中数据绑定转换器Converter-CSDN博客 在View中&#xff1a; <StackPanel Orientation"Vertical"><Slider x:Name"slider_R" Minimum"0" Maximum"255" Wi…

深度学习技巧应用33-零门槛实现模型在多个GPU的分布式流水线训练的应用技巧

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用33零门槛实现模型在多个GPU的分布式流水线训练的应用技巧&#xff0c;本文将帮助大家零门槛的实现模型在多个GPU的并行训练&#xff0c;如果你手头上没有GPU资源&#xff0c;根据本文的介绍也可实现…

dhcp服务器的ip池的待分配ip地址是否冲突的检测机制

看到有的资料说&#xff0c;dhcp服务器在分配ip地址时&#xff0c;要检测是否待分配的ip地址是否存在冲突&#xff0c;会向广播域发出&#xff0c;对应ip发出icmp的ping消息来验证是否冲突。特地用自己的公司的交换机验证一下&#xff0c;在交换机上镜像抓包观察一下。 wiresha…

机器学习实验4——CNN卷积神经网络分类Minst数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1; 原理&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;CNN实现分类Minst&#x1f9e1;&#x1f9e1;代码数据预处理&#xff1a;设置基本参数&#xff1a; &#x1f9e…

接口文档swagger2的使用

Spring-接口文档swagger2 1、swagger/knife4j 接口文档配置 ​ knife4j是swagger的增强版本&#xff0c;更加的小巧、轻量&#xff0c;功能也是更加的完善&#xff0c;UI也更加的清晰&#xff1b;可以从swagger到knife4j无缝切换。 1.1 引入相关依赖 <!--接口文档的开发:…

神经网络:表述(Neural Networks: Representation)

1.非线性假设 无论是线性回归还是逻辑回归&#xff0c;当特征太多时&#xff0c;计算的负荷会非常大。 案例&#xff1a; 假设我们有非常多的特征&#xff0c;例如大于 100 个变量&#xff0c;我们希望用这 100 个特征来构建一个非线性的多项式模型&#xff0c;结果将是数量非…

Win10 如何用powershell写个WOL开机脚本

环境&#xff1a; Win10 专业版 问题描述&#xff1a; Win10 如何用powershell写个WOL开机脚本 解决方案&#xff1a; 1.脚本内容 $mac b1-10-18-52-11-12 $macBytes $mac -split - | ForEach-Object { [byte](0x $_) } $broadcastAddress [byte[]](1..6 | ForEach-O…

springboot导出数据到excel模板,使用hutool导出数据到指定excel,java写入数据到excel模板

最近遇到一个需求&#xff0c;需要从数据库查询数据&#xff0c;写入到对应的excel导入模板中。再把导出的数据进行修改&#xff0c;上传。 我们项目用的是easyExcel&#xff0c;一顿百度搜索&#xff0c;不得其法。 主要是要把数据填充到指定单元格中&#xff0c;跟平时用到的…

c++遍历文件夹下指定后缀的文件

dirent.h dirent.h是一个头文件&#xff0c;它包含了在文件系统中进行目录操作的函数和数据结构的声明。 以下是一些dirent.h头文件中常用的函数和数据结构&#xff1a; DIR结构体&#xff1a;表示一个目录流&#xff0c;用于操作目录。struct dirent结构体&#xff1a;表示…

【Android】细数Linux和Android系统中的伪文件系统

文章目录 前言Linux伪文件系统cgroupfsLinux的cgroupsAndroid的cgroups debugfsfunctionfs(/dev/usb-ffs/adb)functionfs 的引入sysfs是什么 procfs(/proc)pstore(/sys/fs/pstore)selinuxfs(/sys/fs/selinux)sysfs(/sys)参考 前言 做了好些年Android开发&#xff0c;你了解过L…

Java Web(二)--HTML

基本介绍 官网文档地址: HTML 教程 HTML&#xff08;HyperText Mark-up Language&#xff09;即超文本标签语言&#xff1b;HTML 文本是由 HTML 标签组成的文本&#xff0c;可以包括文字、图形、动画、声音、表格、链接等&#xff1b;HTML 的结构包括头部&#xff08;Head&…

《动手学深度学习(PyTorch版)》笔记1

Chapter1 Introduction 机器学习的关键组件 data 每个数据集由一个个样本&#xff08;example, sample&#xff09;组成&#xff0c;大多时候&#xff0c;它们遵循独立同分布(independently and identically distributed, i.i.d.)。 样本有时也叫做数据点&#xff08;data po…

学校“数据结构”课程Project—扩展功能(自主设计)

目录 一、设想功能描述 想法缘起 目标功能 二、问题抽象 三、算法设计和优化 1. 易想的朴素搜索 / dp 搜索想法 动态规划&#xff08;dp&#xff09;想法 2. 思考与优化 四、算法实现 五、结果示例 附&#xff1a;使用的地图API 一、设想功能描述 想法缘起 OSM 导出…

汽车网络架构与常用总线汇总

汽车CAN总线简述 CAN 是控制器局域网Controller Area Network 的缩写&#xff0c;1986年&#xff0c;由德国Bosch公司为汽车开发的网络技术&#xff0c;主要用于汽车的监测与控制&#xff0c;目的为适应汽车“减少线束的数量”“通过多个网络进行大量数据的高速传输”的需求。…

TA百人计划学习笔记 3.1.1模板测试

资料 源视频 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili ppt 3100-模板测试与深度测试(1) 参考 Unity Shader: 理解Stencil buffer并将它用于一些实战案例&#xff08;描边&#xff0c;多边形填充&#xff0c;反射区域限定&#xff0c;阴影…