Python 笔记05(装饰器的使用)
一 装饰器的使用 (@property)
@property 是 Python 中用于创建属性的装饰器。它的作用是将一个类方法转换为类属性,从而可以像 访问属性一样访问该方法,而不需要使用函数调用的语法。使用 @property 主要有以下好处:
-
封装性和隐藏实现细节:通过使用
@property装饰器,你可以将属性的访问封装在方法内部,从而隐藏了实现细节。这有助于防止用户直接访问和修改类的内部状态,提高了类的封装性。 -
属性访问的一致性:将方法转换为属性后,可以使用点运算符 (.) 来访问属性,与直接访问属性时的语法一致。这增强了代码的可读性和一致性。
-
计算属性值:你 可以在
@property方法中添加逻辑来计算属性的值。这允许你根据需要动态生成属性,而不必存储额外的数据。 -
属性验证和保护:
@property方法允许你在 设置属性值之前进行验证和保护。你可以在@property的 setter 方法中添加验证逻辑,确保属性值符合特定条件。 -
适用于重构:如果你决定更改属性的实现方式,可以在不更改类的用户代码的情况下重构
@property方法。这有助于维护代码的兼容性。
class Person:def __init__(self, gender):self.__gender = gender # 私有的@property # 装饰器def gender(self):return self.__gender@gender.setterdef gender(self, value):if value != 'boy' and value != 'girl':raise ValueError('Gender must be boy or girl')else:self.__gender = valueif __name__ == '__main__':p = Person('boy')print(p.gender) # boyp.gender = 'girl' # @gender.setterprint(p.gender) # girlp.gender = 'other' # @gender.setterprint(p.gender) # ValueError: Gender must be boy or girl
二 自定义装饰器
def logger(func): # 被装饰的函数作为方法的参数def class_time():print('二、四、六晚上上课')print('_' * 30)func()print('_' * 30)print('大概下课时间,22:30')return class_time# 函数式
@logger
def work():print('老师在上课')@logger
def work2():print('学生不想上课')if __name__ == '__main__':work()print('\n')work2()
三 装饰器传参和函数传参
1 *args, **kwargs # 自定义位置参数和关键字参数
from functools import wrapsdef main_logger(time_key='二、四、六晚上八点', end_time='21:30'):def logger(func):@wraps(func)def class_time(*args, **kwargs):print('上课时间:', time_key)func(*args, **kwargs)print('下课时间:', end_time)return class_timereturn logger# 核心功能
@main_logger()
def work():print('三月要上课啦!')@main_logger(time_key='一、三、五晚上')
def work2():print('老子今天不上课')@main_logger()
def work4(name, subject):print(f'{name}在上课 {subject}课程')if __name__ == '__main__':# work()# work2()work4('march', 'dj')
四 使用对象做装饰器
class Logs:def __init__(self, start_time='二、四、六晚上20:00', end_time='21:30'):self.start_time = start_timeself.end_time = end_time# 重写object类中 call 方法def __call__(self, func): # func是被装饰的函数def class_time(*args, **kwargs):print('上课时间:', self.start_time)func(*args, **kwargs)print('下课时间:', self.end_time)return class_time@Logs() # 类对象装饰
def work(name, subject):print(f'{name}在上 {subject}')if __name__ == '__main__':work('your', '奇奇怪怪的课')
五 偏函数
functools.partial:需要传入原函数和需要传入的参数
下面两种方式等价:
import functools
int3 = functools.partial(int, base=16)
print(int3('abd'))
直接写:
def int2(num, base=16):return int(num, base)print(int2('abd'))
六 动态修改类状态
@staticmethod 和 @classmethod 是 Python 中用于定义静态方法和类方法的装饰器,它们有不同的作用和用法。
@staticmethod:
- 静态方法是定义在类中的方法,不依赖于类的实例,也不依赖于类的状态。
- 它通常用于那些不需要访问实例属性或方法的情况,可以看作是类的工具函数。
- 静态方法的第一个参数通常不是
self或cls,而是一个普通参数,用于传递方法所需要的数据。
@classmethod:
- 类方法是定义在类中的方法,但它与类的实例无关,而是依赖于类本身。
- 类方法的第一个参数通常是
cls,用于表示类本身,可以访问类的属性和调用其他类方法。 - 类方法通常用于工厂方法,或者在创建实例之前对类进行一些操作。
6.1 定义类
class Person:def __init__(self, name, age):self.name = nameself.age = ageif __name__ == '__main__':p = Person('march', 20)print('name:', p.name)print('age:', p.age)
6.2 添加属性
p.gender = 'boy' # 动态添加属性
print('gender:', p.gender)
6.3 动态添加方法
def fun():print('我是一个普通函数,即将成为一个实例 方法')# 动态添加方法
p.show = fun
p.show()def fun2(self):print('我也是一个普通函数,第一个参数是self,类成员方法的第一个参数就是self')# 第二种添加方式
p.show2 = types.MethodType(fun2, p)
p.show2()
6.4 动态添加静态方法
@staticmethod
def static_func():print('马上成为Person类中的静态方法, staticmethod')# 动态添加静态方法, 通过类名调用
Person.sf = static_func
Person.sf()
6.5 动态添加类方法
@classmethod
def class_func(cls):print('马上成为Person类中的类方法, class_method')# 动态添加类方法
Person.cf = class_funcPerson.cf()# 动态添加类方法
print(dir(Person))
print(dir(p))
6.6 限制属性的添加
__slots__:现在属性的添加
class Person:__slots__ = ('name', 'age')def __init__(self, name, age):self.name = nameself.age = ageif __name__ == '__main__':p = Person('march', 20)p.gender = 'boy' # __slots__ = ('name', 'age') 限制可以添加的属性print('gender:', p.gender)
相关文章:
Python 笔记05(装饰器的使用)
一 装饰器的使用 (property) property 是 Python 中用于创建属性的装饰器。它的作用是将一个类方法转换为类属性,从而可以像 访问属性一样访问该方法,而不需要使用函数调用的语法。使用 property 主要有以下好处: 封装性和隐藏实现细节&…...
记忆化搜索,901. 滑雪
901. 滑雪 - AcWing题库 给定一个 R 行 C 列的矩阵,表示一个矩形网格滑雪场。 矩阵中第 i行第 j 列的点表示滑雪场的第 i 行第 j列区域的高度。 一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。 当然࿰…...
计算机网络:连接世界的纽带
计算机网络的基础概念 计算机网络是一组相互连接的计算机,它们通过通信链路和协议进行数据交换和资源共享。以下是一些关键概念: 1. 节点和主机 网络中的计算机设备称为节点,通常是主机或服务器。主机是普通用户或终端设备,而服…...
SpringMVC 学习(三)注解开发
4. 注解开发 4.1 环境搭建 (1) 新建 maven 模块 springmvc-03-annotation (2) 确认依赖 确认方法同 3(2),手动导入发布依赖见3(11) <!--资源过滤--> <build><resources><resource><directory>src/main/java</directory>&…...
0x84加密数据传输服务
为了在安全模式下实现一些诊断服务,在服务端和客户端应用程序之间添加了Security sub-layer。在客户端与服务端之间进行诊断服务数据传输有两种方法: 1、非安全模式下数据传输 应用程序使用诊断服务(diagnostic Services)和应用层服务原语(Applicati…...
Vue.js快速入门:构建现代Web应用
Vue Vue.js是一款流行的JavaScript框架,用于构建现代的、交互式的Web应用程序。它具有简单易学的特点,同时也非常强大,能够帮助开发者构建高效、可维护的前端应用。本篇博客将带你快速入门Vue.js,并演示如何构建一个简单的Vue应用…...
Scala第五章节
Scala第五章节 scala总目录 章节目标 掌握方法的格式和用法掌握函数的格式和用法掌握九九乘法表案例 1. 方法 1.1 概述 实际开发中, 我们需要编写大量的逻辑代码, 这就势必会涉及到重复的需求. 例如: 求10和20的最大值, 求11和22的最大值, 像这样的需求, 用来进行比较的逻…...
erlang练习题(三)
题目一 查询列表A是否为列表B的前缀 解答 isPrefix([], List2) -> io:format("A is prefix of B ~n");isPrefix([H1 | ListA], [H2 | ListB]) ->case H1 H2 oftrue -> isPrefix(ListA, ListB);false -> io:format("A is not prefix of B ~n&quo…...
What Is A DNS Amplification DDoS Attack?
什么是 DNS 放大攻击? 域名系统 (DNS) 是用于在网站的机器可读地址(例如 191.168.0.1:80)和人类可读名称(例如 radware.com)之间进行解析的目录在 DNS 放大攻击中,攻击者…...
jvm笔记
好处: 跨平台 内存管理机制,垃圾回收功能 数组下标越界检查 多态 名词解释: jvm java虚拟机,是java程序的运行环境 jre jvm基础类库 jdk jre编译工具 javase jdkide工具 javaee javase应用服务器 jvm的内存结构: 程序…...
WPF中的控件
内容控件:label、border Window控件 Label控件 Border控件 内容控件 Button控件 点击取消按钮关闭程序;点击登录按钮打开BorderWindow窗口。 TextBox控件 PasswordBox控件 TextBlock控件 加载窗口时显示TextBlock中的内容 RadioButton控件 CheckBox控件…...
Java下对象的序列化和反序列化(写出和读入)
代码如下: public class MyWork {public static void main(String[] args) throws IOException, ClassNotFoundException {//序列化File f new File("testFile/testObject.txt");ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(…...
基于springboot的洗衣店订单管理系统
目录 前言 一、技术栈 二、系统功能介绍 顾客信息管理 店家信息管理 店铺信息管理 洗衣信息管理 预约功能 洗衣信息 交流区 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势&#x…...
Llama2部署踩坑
1、权重是.bin,但是报错找不到.safetensors 明明权重文件是.bin,但是却提示我缺少.safetensors。最后发现好像是 llama2-7b这个模型文件不行,必须要llama2-7b-chat这个模型才能读取的通,具体原因还暂不明确。...
Adams齿轮副
1.运动副 添加旋转副的时候,必须先物体后公共part(即此处的ground),最后再选择质心点 2.啮合点 啮合点marker的z轴必须是齿轮分度圆的切线方向 3.啮合点 两齿轮的旋转副,和啮合点,即cv marker ,必须属…...
Elasticsearch keyword 中的 ignore_above配置项
1. ignore_above 关于es mapping的keyword ignore_above配置项的解释如下: Do not index any string longer than this value. Defaults to 2147483647 so that all values would be accepted. 不会索引大于ignore_above配置值的数据,默认值2147483647字…...
RabbitMQ原理(一):基础知识
文章目录 1.初识MQ1.1.同步调用1.2.异步调用1.3.技术选型2.RabbitMQ2.1.安装2.2.收发消息2.2.1.交换机2.2.2.队列2.2.3.绑定关系2.2.4.发送消息2.3.数据隔离2.3.1.用户管理2.3.2.virtual host微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于…...
[Linux]Git
文章摘于GitHub博主geeeeeeeeek 文章目录 1.1 Git 简易指南创建新仓库工作流添加与提交推送改动 1.2 创建代码仓库git init用法讨论裸仓库 例子 git clone用法讨论仓库间协作 例子用法讨论栗子 1.3 保存你的更改git add用法讨论缓存区 栗子 git commit用法讨论记录快照…...
ChatGPT终于可以进行网络搜索 内容不再限于2021年9月前
微软和谷歌已经让旗下聊天机器人进行网上搜索,并提供原始材料的链接,以提高信息共享的可信度和范围。但是,ChatGPT迄今为止只接受了有时间限制的训练数据,这些数据仅限于从互联网上收集的2021年9月之前的信息。在周三的一系列推文…...
uni-app:实现页面效果1
效果 代码 <template><view><view class"add"><image :src"add_icon" mode""></image></view><view class"container_position"><view class"container_info"><view c…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
