一起学习python类的属性装饰器@property

   

   之前文章我们介绍了class的一些通用功能,比如类属性/类方法/实例属性/实例方法等,之前的属性可以直接修改和访问(设置私有属性,不能直接访问,可通过对象名._[类名][属性名]的方式访问),没有一些权限的控制逻辑。

    本章主要介绍属性装饰器@property(还有实现相同功能的property()函数),该装饰器可把函数当成属性使用,可直接访问,访问时不用添加双括号(),并可对其进行一些修改和删除的权限控制。

@property装饰器

未使用@property之前,我们一般定义类属性和实例属性如下:

定义一个5座汽车的类Car,初始化三个参数品牌,颜色,性价比。

class Car():persons = 5def __init__(self,brand,color,cost_performance):self.brand = brandself.color = colorself.cost_performance = cost_performance
#修改Car类的类属性值为7座
Car.persons = 7
print(f'汽车乘坐人数 :{Car.persons}')#对Car类实例化,带入品牌等参数
Mercedes_Benz = Car('GLC260','black','不高')
#获取品牌参数
print(f'汽车品牌 :{Mercedes_Benz.brand}')#修改Mercedes_Benz实例化属性-品牌
Mercedes_Benz.brand = 'bmwx3'
print(f'汽车品牌 :{Mercedes_Benz.brand}')
打印结果如下:
汽车乘坐人数 :7
汽车品牌 :GLC260
汽车品牌 :bmwx3

我们使用@property属性装饰器改造下brand属性的获取/修改和删除功能,定义一个函数carbrand返回self.brand。

@property
def carbrand(self):return self.brand@carbrand.setter
def carbrand(self,brand):self.brand = brandprint(f'设置实例属性品牌为{self.carbrand}')@carbrand.deleter
def carbrand(self):print('不能删除实例属性')raise False
  • @carbrand.setter装饰器: 当对carbrand属性修改赋值时执行该函数
  • @carbrand.deleter装饰器:当对carbrand属性删除时执行该函数

我们访问和修改,删除属性看下是什么结果

Mercedes_Benz = Car('GLC260','black','不高')
#修改属性值
Mercedes_Benz.carbrand = 'bmwx3'
print(f'汽车品牌 :{Mercedes_Benz.carbrand}')#删除属性值
del Mercedes_Benz.carbrand

结果显示执行了被@carbrand.setter装饰的函数,被@carbrand.deleter装饰的函数

#打印结果如下
设置实例属性品牌为bmwx3
汽车品牌 :bmwx3
不能删除实例属性
Traceback (most recent call last):File "/Users/htsc/Desktop/test.py", line 204, in <module>del Mercedes_Benz.carbrandFile "/Users/htsc/Desktop/test.py", line 181, in carbrandraise FalseTypeError: exceptions must derive from BaseException

property函数

使用property()函数也可以实现类似@property的功能,将上述例子改造如下:


def carbrand(self):return self.branddef carbrand_setter(self, brand):self.brand = brandprint(f'设置实例属性品牌为{self.brand}')def carbrand_deleter(self):print('不能删除实例属性')raise False
#定义property()函数赋值给newbrad
newbrand = property(carbrand, carbrand_setter, carbrand_deleter,'汽车品牌')

property()函数是一个内置函数,可传入四个参数,分别对应getter方法、setter方法、deleter方法和docstring。其中,getter方法用于获取属性值,setter方法用于设置属性值,deleter方法用于删除属性,docstring则是该属性的文档说明。

同样我们访问/修改和删除newbrand属性,看下结果

Mercedes_Benz = Car('GLC260','black','不高')#获取属性
print(f'汽车品牌 :{Mercedes_Benz.newbrand}')
#修改属性
Mercedes_Benz.newbrand = 'bmwx3'
print(f'修改汽车品牌 :{Mercedes_Benz.newbrand}')
#删除属性
del Mercedes_Benz.newbrand

结果如下:跟@property的结果一样

汽车品牌 :GLC260
设置实例属性品牌为bmwx3
修改汽车品牌 :bmwx3
不能删除实例属性
Traceback (most recent call last):File "/Users/htsc/Desktop/test.py", line 218, in <module>del Mercedes_Benz.newbrandFile "/Users/htsc/Desktop/test.py", line 204, in carbrand_deleterraise FalseTypeError: exceptions must derive from BaseException

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。

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

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

相关文章

pandas笔记:找出在一个dataframe但不在另一个中的index

1 问题描述 假设我们有两个dataframe&#xff08;这一段代码&#xff09;来自transbigdata 笔记&#xff1a;官方文档案例1&#xff08;出租车GPS数据处理&#xff09;-CSDN博客 data tbd.clean_outofshape(data, sz, col[Lng, Lat], accuracy500) data data2 tbd.clean_ta…

使用Pygame显示文字的示例代码

import pygame import syspygame.init()# 设置窗口尺寸 win_size (800, 600) screen pygame.display.set_mode(win_size) pygame.display.set_caption("文字显示示例")# 设置字体和文字内容 font pygame.font.SysFont(None, 48) # 使用系统默认字体&#xff0c;字…

图像配准基于传统特征的方法代码实现(SIFT、SURF、ORB、AKAZE)

自21世纪初以来&#xff0c;图像配准主要使用基于特征的方法。这些方法有三个步骤&#xff1a;关键点检测和特征描述&#xff0c;特征匹配&#xff0c;图像变换。简单的说&#xff0c;我们选择两个图像中的感兴趣点&#xff0c;将参考图像&#xff08;reference image&#xff…

完整的模型训练套路(一、二、三)

搭建神经网络 model import torch from torch import nn#搭建神经网络 class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.model nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2),nn.Conv…

海外市场调研为什么要用独享静态代理IP?

独享静态IP在海外市场调研中扮演着至关重要的角色&#xff0c;提供了一系列无可比拟的优势。独享静态代理IP的稳定性和可靠性对于长期的市场调研至关重要&#xff0c;它保证了连接的持续性和数据的准确性。通过这些方面的综合优势&#xff0c;独享静态代理IP成为海外市场调研中…

【JavaWeb学习笔记】19 - 网购家居项目开发(上)

一、项目开发流程 程序框架图 项目具体分层方案 MVC 1、说明是MVC MVC全称: Mode模型、View视图、Controller控制器。 MVC最早出现在JavaEE三层中的Web层&#xff0c;它可以有效的指导WEB层的代码如何有效分离&#xff0c;单独工作。 View视图:只负责数据和界面的显示&…

张驰咨询:集成产品开发(IPD)的原理和实践技巧

IPD&#xff0c;是集成产品开发&#xff08;Integrated Product Development&#xff09;的缩写&#xff0c;它是集成了众多管理模型和理论、众多企业最佳管理实践的一整套体系&#xff0c;可以帮助企业快速响应市场变化、缩短产品上市时间、减少资源浪费、提高生产力&#xff…

RK3399平台入门到精通系列讲解(基础篇)__LITTLE_ENDIAN_BITFIELD 宏的使用

🚀返回总目录 文章目录 一、什么是字节序二、小端模式(Little-Endian)三、大端模式(Big-Endian)四、__LITTLE_ENDIAN_BITFIELD 使用案例一、什么是字节序 在计算机中,数据是以最原始的二进制 0 和 1 的方式被存储的。在大多数现代计算机体系架构中,计算机的最小可寻址数…

【MATLAB源码-第107期】基于matlab的OFDM系统在瑞利信道下功率分配仿真,使用注水算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在瑞利衰落信道下&#xff0c;OFDM&#xff08;正交频分复用&#xff09;系统的功率分配可以通过“注水算法”&#xff08;water-filling algorithm&#xff09;的方法来优化。这种算法的目的是在不同的子载波上分配不同的功…

Hive数据库:嵌入、本地、远程全攻略(上)

Hive分布式数据仓库工具 关系型数据库 建立在关系模型之上的数据库称为关系型数据库(关系模型是由埃德加科德于1970年提出的)&#xff0c;关系型数据库借助集合代数等数学概念处理数据库中的数据。数据查询语言SOL是基于关系型数据库的语言,能够对关系型数据库中的数据进行检…

CSS3中transform2D变形详解

CSS3变形 在CSS3中&#xff0c;动画效果包括3个部分&#xff1a; 变形(transform)过渡(transition)动画(animation) 在实际开发中&#xff0c;有时需要实现元素的各种变形效果&#xff0c;如平移&#xff0c;缩放&#xff0c;旋转&#xff0c;倾斜等。 在CSS3中&#xff0c…

Kafka的简介及架构

目录 消息队列 产生背景 消息队列介绍 常见的消息队列产品 应用场景 消息队列的消息模型 Kafka的基本介绍 简介 Kafka的架构 Kafka的使用 Kafka的shell命令 Kafka的Python API的操作 完成生产者代码 完成消费者代码 消息队列 产生背景 消息队列:指数据在一个容器…