@property 详解

定义

python装饰器接受一个可调用对象作为输入,并返回一个新的可调用对象

比较

函数装饰器类装饰器方法装饰器
参数接受函数作为参数接受类作为参数接受方法(类的函数成员)作为参数
返回值返回一个新函数返回一个新类(通常是原始类的子类)通常返回原始方法或修改后的方法
应用场景为函数添加额外的功能,如日志记录、计时、缓存等修改类的行为或结构,如添加方法、修改元类等修改或增强类中的方法行为
使用方式使用@符号应用于函数定义之前使用@符号应用于类定义之前使用@符号应用于类的方法定义之前
复杂性相对较低,主要关注函数的修改和增强相对较高,需要处理类的继承、方法和属性等适中,需要理解类和方法的上下文
性能通常性能较好,因为不涉及类的创建和继承性能可能略逊于函数装饰器,但通常可以接受性能通常与函数装饰器相似

类装饰器

类装饰器提供了更多的灵活性和封装性

类可以包含状态(通过实例变量)和行为(通过方法)

  • 状态管理
  • 可配置性
  • 多个装饰器
  • 代码组织

class MyDecorator:  def __init__(self, func):  self.func = func  def __call__(self, *args, **kwargs):  print("Before function call")  result = self.func(*args, **kwargs)  print("After function call")  return result  # 使用装饰器  
@MyDecorator  
def say_hello(name):  print(f"Hello, {name}!")  # 调用函数  
say_hello("World")

描述符

  • __get__ /__set__ 用于控制属性访问/赋值过程

    • 当一个对象作为另一个对象的属性被访问时,解释器会调用该对象的 __get__ 方法
    • 应用场景 访问控制/计算属性/缓存/数据验证/惰性加载
    • property 的本质是一个数据描述符,一个类
      • 实现了 __get__()__set__()__delete__() 方法
      • 在使用 @property 装饰器时
      • Python 解释器会将属性方法包装成 property 类的实例,并将其添加为类的属性
    class Descriptor:def __get__(self, instance, owner):print(f"Getting attribute from {owner} instance")return "Return value from descriptor"class MyClass:attr = Descriptor()obj = MyClass()print(obj.attr)
  • __getattr__ 方法用于捕获对象属性访问的失败情况,备用

  • __getitem__ 方法用于对象的索引访问操作

property 模拟

class PropertyDescriptor:  def __init__(self, fget=None, fset=None, fdel=None, doc=None):  self.fget = fget  self.fset = fset  self.fdel = fdel  if doc is None and fget is not None:  doc = fget.__doc__  self.__doc__ = doc  def __get__(self, obj, objtype=None):  if obj is None:  return self  if self.fget is None:  raise AttributeError("unreadable attribute")  return self.fget(obj)  def __set__(self, obj, value):  if self.fset is None:  raise AttributeError("can't set attribute")  self.fset(obj, value)  def __delete__(self, obj):  if self.fdel is None:  raise AttributeError("can't delete attribute")  self.fdel(obj)  # 使用 PropertyDescriptor 类装饰器  
class MyClass:  def __init__(self):  self._value = None  @PropertyDescriptor  def value(self):  """Getter for the value."""  return self._value  @value.setter  def value(self, value):  """Setter for the value."""  self._value = value  @value.deleter  def value(self):  """Deleter for the value."""  del self._value  # 示例用法  
obj = MyClass()  
obj.value = 42  # 调用 setter 方法  
print(obj.value)  # 调用 getter 方法,输出: 42  
del obj.value  # 调用 deleter 方法

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

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

相关文章

掌握PostgreSQL:从安装到高级查询的全面教程

感谢您阅读本文,欢迎“一键三连”。作者定会不负众望,按时按量创作出更优质的内容。 ❤️ 1. 毕业设计专栏,毕业季咱们不慌,上千款毕业设计等你来选。 PostgreSQL是一种功能强大、开源的关系型数据库管理系统,广泛应用…

我的选择与思考

深度挖掘与扩展:专业选择的重要性及其长远影响 在面对高考后的大学与专业选择时,很多考生和家长可能会陷入纠结。究竟是追求名校的光环,还是选择一个真正适合自己、有发展前景的专业?这一问题背后涉及到的不仅仅是四年的大学生活…

2024/06/18--代码随想录算法8/17| 股票问题

121.买卖股票的最佳时机 力扣链接 动规五部曲 确定dp数组(dp table)以及下标的含义 dp[i][0] 表示第i天持有股票所得最多现金,dp[i][1] 表示第i天不持有股票所得最多现金确定递推公式 dp[i][0] max(dp[i-1][0], -price[i]) dp[i][1]max(dp[i-1][1], …

智能中人类造成的风险、机器造成的风险、环境造成的风险

在使用智能技术时,可能会面临各种类型的风险。以下是一些可能的风险情况: 1、人类造成的风险 错误判断和决策:人类在使用智能系统时可能会因为各种原因做出错误的判断和决策,导致不良后果。人为错误:技术操作人员、维护…

QTimeEdit、QDateEdit、QDateTimeEdit、QCalendarWidget

实验 QTime和字符串相互转换 QDate和字符串相互转换 QDateTime和字符串相互转换 QCalendarWidget使用 year,month,day,minute,second,msec,dayOfWeek, dayto方法/属性的使用 布局 datetimeexample.cpp #inc…

智慧之选:Vatee万腾平台,引领未来的创新引擎

在数字化浪潮席卷全球的今天,我们身处一个信息爆炸、技术革新的时代。在这样的大背景下,选择一个能够引领我们走向未来的平台显得尤为重要。而Vatee万腾平台,正是这样一个不容错过的智慧之选。 Vatee万腾平台,作为一个集创新、科技…

PostgreSQL源码分析——口令认证

认证机制 对于数据库系统来说,其作为服务端,接受来自客户端的请求。对此,必须有对客户端的认证机制,只有通过身份认证的客户端才可以访问数据库资源,防止非法用户连接数据库。PostgreSQL支持认证方法有很多&#xff1…

人工智能初学教程 - 基于MindSpore

人工智能初学教程 - 基于MindSpore MindSpore 教案 介绍 目标: 提供对 MindSpore 的全面介绍,包括其架构、特性和安装方法。 目录 基本介绍 什么是 MindSpore?MindSpore 架构 自动微分自动并行安装 Pip 模式方法安装源代码编译安装Docker…

Stable Diffusion 3 Medium 正式开源

Stable Diffusion 3 Medium 正式开源 Stability AI宣布Stable Diffusion 3 Medium现已开源,这是最新的文本生成图像AI模型,被官方声称为“迄今为止最先进的开源模型”,其性能超过了Midjourney 6。 这款Stable Diffusion 3 Medium模型拥有2…

【SpringBoot项目常见细化错误】(保姆级教程)Result Maps collection already contains value for

SpringBoot项目常见错误 1.当Mybatis报错 Result Maps collection already contains value for一、重复点击Mybatis-Generator导致配置文件重复生成XML二、正确配置Yml仔细检查有没有多了或者少了一个空格三、spring boot mybatis四、应该用resultMap来接收返回值,…

邦芒解析:新人入职后存在的三种职场心理误区

​​多数职场新人会认为自己工作不快乐,不能正确处理职场人际关系。尤其是新人入职后在处理人际关系方面更明显,下面简述新人入职后主要存在的三种职场心理误区。 误区一:面对对上司的恐惧 学会和上司沟通,新人要采用上司容易接受…

Blazor的SSR服务端渲染是不是交互式的

从.NET8开始,Blazor引入了SSR服务端渲染,归功于MVC和RazePage的沉淀,虽然来得晚,但一经发布,就将Blazor推向了新的高度。从今年开始,Youtube上关于Blazor的优质教学视频,以肉眼可见的速度在增加…

[保姆级教程]uniapp实现接口请求和请求方法二次封装

文章目录 新建文件配置方法发送请求使用 新建文件 现在src中新建一个api目录 新建index.js和request.js文件 配置方法发送请求 request.js中输入以下内容 const http {baseUrl: http://127.0.0.1:8000,request(config) {config beforeRequest(config)config.url this…

前端工具篇

在线工具 https://tool.lu/ 程序员工具箱 http://tool.pfan.cn/apitest 配色 https://webkul.github.io/coolhue/ 在线字符串和16进制互转 https://kw360.net/ox2str/ 代码美化截图 https://carbon.now.sh/?bgrgba 菜鸟工具 https://www.jyshare.com/ 文件格式转换 htt…

C++智能指针auto_ptr(有缺陷已废弃)

一、auto_ptr不能共享所有权 auto_ptr类没有拷贝构造函数。可以看出将Right对象的资源释放掉了。 在下面的操作中,ptr1的值给ptr2,那么此时ptr1的值将会为nullptr。在构造和赋值都发生了所有权的转移。调用函数的时候,接收参数的时候同样也会…

Rapidfuzz,一个高效的 Python 模糊匹配神器

目录 01初识 Rapidfuzz 什么是 Rapidfuzz? 为什么选择 Rapidfuzz? 安装 Rapidfuzz 配置 Rapidfuzz 02基本操作 简单比率计算 03高级功能 查找单个最佳匹配 查找多个最佳匹配 使用阈值优化性能 04实战案例…

IPython大师课:提升数据科学工作效率的终极工具

IPython是一个增强的Python交互式shell,它提供了丰富的功能和易用性改进,特别适合进行数据分析、科学计算和一般的Python开发。本文将全面介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython最初由Fe…

【Android】使用Binder(AIDL)实现利用自定义Bean进行的进程间通信(二)

项目前置 这是我之前写的关于Binder的一些知识点和使用基本数据类型在通信的文章,感兴趣的可以看一下: Binder(一)Binder的介绍和AIDL使用Binder的实例 项目目标 在两个APP之间进行数据传递,使用Android推荐的Binder通讯&#…

PKCS和X.509标准的区别是什么?

PKCS(Pulic Key Cryptography Standards)和X.509标准都是与公钥加密和数字证书相关的标准,但它们的主要职责和关注点略有不同: 1. PKCS(Public Key Cryptography Standards) PKCS是一系列标准,由RSA Security开发&am…

使用Flink接受kafka中的数据并对数据进行ETL

做这个开发是因为:在实际开发操作中,你的kafka主题中会有大量的数据但是需求并不需要所有数据,所有我们要对数据进行清洗,把需要的数据保存在flink流中,为下流的开发做好数据保障! 首先创建工具类 再写一…