当前位置: 首页 > news >正文

Python 笔记05(装饰器的使用)

一 装饰器的使用  (@property)

@property 是 Python 中用于创建属性的装饰器。它的作用是将一个类方法转换为类属性,从而可以像 访问属性一样访问该方法,而不需要使用函数调用的语法。使用 @property 主要有以下好处:

  1. 封装性和隐藏实现细节:通过使用 @property 装饰器,你可以将属性的访问封装在方法内部,从而隐藏了实现细节。这有助于防止用户直接访问和修改类的内部状态,提高了类的封装性。

  2. 属性访问的一致性:将方法转换为属性后,可以使用点运算符 (.) 来访问属性,与直接访问属性时的语法一致。这增强了代码的可读性和一致性。

  3. 计算属性值:你 可以在 @property 方法中添加逻辑来计算属性的值。这允许你根据需要动态生成属性,而不必存储额外的数据。

  4. 属性验证和保护@property 方法允许你在 设置属性值之前进行验证和保护。你可以在 @property 的 setter 方法中添加验证逻辑,确保属性值符合特定条件。

  5. 适用于重构:如果你决定更改属性的实现方式,可以在不更改类的用户代码的情况下重构 @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()

三 装饰器传参和函数传参

*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

  • 静态方法是定义在类中的方法,不依赖于类的实例,也不依赖于类的状态。
  • 它通常用于那些不需要访问实例属性或方法的情况,可以看作是类的工具函数。
  • 静态方法的第一个参数通常不是 selfcls,而是一个普通参数,用于传递方法所需要的数据。

@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列区域的高度。 一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。 当然&#xff0…...

计算机网络:连接世界的纽带

计算机网络的基础概念 计算机网络是一组相互连接的计算机,它们通过通信链路和协议进行数据交换和资源共享。以下是一些关键概念: 1. 节点和主机 网络中的计算机设备称为节点,通常是主机或服务器。主机是普通用户或终端设备,而服…...

SpringMVC 学习(三)注解开发

4. 注解开发 4.1 环境搭建 (1) 新建 maven 模块 springmvc-03-annotation (2) 确认依赖 确认方法同 3(2)&#xff0c;手动导入发布依赖见3(11) <!--资源过滤--> <build><resources><resource><directory>src/main/java</directory>&…...

0x84加密数据传输服务

为了在安全模式下实现一些诊断服务&#xff0c;在服务端和客户端应用程序之间添加了Security sub-layer。在客户端与服务端之间进行诊断服务数据传输有两种方法&#xff1a; 1、非安全模式下数据传输   应用程序使用诊断服务(diagnostic Services)和应用层服务原语(Applicati…...

Vue.js快速入门:构建现代Web应用

Vue Vue.js是一款流行的JavaScript框架&#xff0c;用于构建现代的、交互式的Web应用程序。它具有简单易学的特点&#xff0c;同时也非常强大&#xff0c;能够帮助开发者构建高效、可维护的前端应用。本篇博客将带你快速入门Vue.js&#xff0c;并演示如何构建一个简单的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 放大攻击&#xff1f; 域名系统 &#xff08;DNS&#xff09; 是用于在网站的机器可读地址&#xff08;例如 191.168.0.1&#xff1a;80&#xff09;和人类可读名称&#xff08;例如 radware.com&#xff09;之间进行解析的目录在 DNS 放大攻击中&#xff0c;攻击者…...

jvm笔记

好处&#xff1a; 跨平台 内存管理机制&#xff0c;垃圾回收功能 数组下标越界检查 多态 名词解释&#xff1a; jvm java虚拟机&#xff0c;是java程序的运行环境 jre jvm基础类库 jdk jre编译工具 javase jdkide工具 javaee javase应用服务器 jvm的内存结构&#xff1a; 程序…...

WPF中的控件

内容控件&#xff1a;label、border Window控件 Label控件 Border控件 内容控件 Button控件 点击取消按钮关闭程序&#xff1b;点击登录按钮打开BorderWindow窗口。 TextBox控件 PasswordBox控件 TextBlock控件 加载窗口时显示TextBlock中的内容 RadioButton控件 CheckBox控件…...

Java下对象的序列化和反序列化(写出和读入)

代码如下&#xff1a; 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、代码封装 前言 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#x…...

Llama2部署踩坑

1、权重是.bin&#xff0c;但是报错找不到.safetensors 明明权重文件是.bin&#xff0c;但是却提示我缺少.safetensors。最后发现好像是 llama2-7b这个模型文件不行&#xff0c;必须要llama2-7b-chat这个模型才能读取的通&#xff0c;具体原因还暂不明确。...

Adams齿轮副

1.运动副 添加旋转副的时候&#xff0c;必须先物体后公共part(即此处的ground&#xff09;&#xff0c;最后再选择质心点 2.啮合点 啮合点marker的z轴必须是齿轮分度圆的切线方向 3.啮合点 两齿轮的旋转副&#xff0c;和啮合点&#xff0c;即cv marker &#xff0c;必须属…...

Elasticsearch keyword 中的 ignore_above配置项

1. ignore_above 关于es mapping的keyword ignore_above配置项的解释如下&#xff1a; Do not index any string longer than this value. Defaults to 2147483647 so that all values would be accepted. 不会索引大于ignore_above配置值的数据&#xff0c;默认值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用法讨论记录快照&#xf…...

ChatGPT终于可以进行网络搜索 内容不再限于2021年9月前

微软和谷歌已经让旗下聊天机器人进行网上搜索&#xff0c;并提供原始材料的链接&#xff0c;以提高信息共享的可信度和范围。但是&#xff0c;ChatGPT迄今为止只接受了有时间限制的训练数据&#xff0c;这些数据仅限于从互联网上收集的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…...

归一化和标准化的联系与区别及建议

归一化和标准化是数据预处理中常用的两种方法。它们都是为了调整数据的尺度,使得数据更符合我们的分析需求。虽然二者的目的相同但是具体实现方式和适用场景却有所不同。下面,我们来详细介绍-下它们的联系和区别。 一、联系 归一化和标准化都能够使得数据的尽度缩放到不同的…...

数据结构--栈的实现

数据结构–栈的实现 1.栈的概念和结构&#xff1a; 栈的概念&#xff1a;栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Las…...

第十章 异常

python使用异常的特殊对象管理程序执行期间发生的错误。每当发生错误时&#xff0c;python会创建异常对象。如果编写了处理该异常的代码&#xff0c;程序将继续运行&#xff1b;如果未处理&#xff0c;程序将显示traceback。 异常是使用try-except代码块处理的。使用try-excep…...

Rust冒泡排序

Rust冒泡排序 这段代码定义了一个名为 bubble_sort 的函数&#xff0c;接受一个可变的整数类型数组作为输入&#xff0c;然后使用嵌套的循环来实现冒泡排序。外部循环从数组的第一个元素开始迭代到倒数第二个元素&#xff0c;内部循环从数组的第一个元素开始迭代到倒数第二个元…...

麒麟信安服务器操作系统V3.5.2重磅发布!

9月25日&#xff0c;麒麟信安基于openEuler 22.03 LTS SP1版本的商业发行版——麒麟信安服务器操作系统V3.5.2正式发布。 麒麟信安服务器操作系统V3定位于电力、金融、政务、能源、国防、工业等领域信息系统建设&#xff0c;以安全、稳定、高效为突破点&#xff0c;满足重要行…...

密码技术 (1) - 对称密码

一. 前言 对称密码是指加密数据和解密数据使用的是相同的秘钥。发送者使用秘钥将加密后的数据发送给接受者&#xff0c;接收者收到数据后用相同的秘钥解密&#xff0c;恢复原始数据。 对称密码具有加密和解密快速的特点&#xff0c;适用于需要快速加密的场景&#xff0c;常用的…...

基于PYQT5的GUI开发系列教程【二】QT五个布局的介绍与运用

目录 本文概述 作者介绍 创建主窗口 水平布局 垂直布局 栅格布局 分裂器水平布局 分裂器垂直布局 自由布局 取消原先控件的布局的方法 尾言 本文概述 PYQT5是一个基于python的可视化GUI开发框架&#xff0c;具有容易上手&#xff0c;界面美观&#xff0c;多平台…...

Cadence PCB 焊盘和封装

封装(Packaging) 封装指的是在电子元件制造中将电子元件(例如集成电路芯片、电子元器件等)进行物理保护和连接的过程。封装通常涉及将电子元件封装到外部保护壳或包装中,以确保其正常运作、连接到电路板并保护它们免受环境因素的影响。 封装的主要目标包括以下几个方面:…...

正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。

正在等待操作系统重新启动。 请重新启动计算机以安装autocad 2024。 这是刚启动Autodesk 2024产品就弹出的弹窗&#xff0c;重启之后启动还是有这个 一直阻止安装程序运行 出现问题的原因是安装包存在问题 使用正确的安装包即可解决这个问题 需要的朋友查看图片或者评伦取…...

Windows电脑显示部分功能被组织控制

目录 问题描述 解决方法 总结 问题描述 如果你的电脑出现以上情况&#xff0c;建议你使用我这种方法&#xff08;万不得已&#xff09; 解决方法 原因就是因为当时你的电脑在激活的时候是选择了组织性激活的&#xff0c;所以才会不管怎么搞&#xff0c;都无法摆脱组织的控…...

网站建设一般多少钱新闻/百度关键词快速排名方法

1.IN 操作符 在业务密集的SQL当中尽量不采用IN操作符而使用EXISTS 2.NOT IN 操作符 强列推荐不使用3. <> 操作符 强列推荐不使用 用其它相同功能的操作运算代替, 如 a<>0 改为 a>0 or a<0 ;a<>’’ 改为 a>’’ 4. > < 操作符 推荐 5. LIKE 操…...

网站知识/手机优化软件哪个好用

前言看完快递鸟api对接教程这篇文章,然后把源码复制到你的项目上,就能快速完成中通快递接口对接.更适合刚入门的菜鸟,调用快递鸟的中通快递查询API接口&#xff0c;能查询到中通快递单号从收件、运输&#xff0c;到转运中心&#xff0c;派送到签收等各个环节的物流发货状态。快…...

一流的购物网站建设/国际最新新闻

文章目录1 introduction2 evaluation题目&#xff1a;TENET: A Framework for Modeling Tensor Dataflow Based on Relation-centric Notation时间&#xff1a;2021会议&#xff1a;ISCA研究机构&#xff1a;北大 1 introduction 如何描述数据流&#xff1f; 本文总结了三种形…...

家政网站模板/免费大数据平台

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;N1叉车司机免费试题是安全生产模拟考试一点通生成的&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材汇编出N1叉车司机仿真模拟考试。2021年N1叉车司机免费试题及…...

上海高端网站建设公/外贸网站搭建

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;linux除了正常的rwx权限外&#xff0c;还有一类附加权限。即&#xff1a;SET位权限(suid、sgid)&粘滞位权限(sticky)SET位权限set位权限(suid、sgid)是为了使“…...

营销型网站建设实战感想/公司广告推广

前几天吐槽了一本口水太多的推荐系统书籍《Practical Recommender Systems实用推荐系统》&#xff0c;最近读到了这本《机器学习范式在推荐系统中的应用》&#xff08;英文名《Machine Learning Paradigms- Applications in Recommender Systems》&#xff09;。只有一百三十来…...