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

news/2024/7/24 2:45:01 标签: python, 开发语言

   

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

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

@property装饰器

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

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

class Car():
  persons = 5
  def __init__(self,brand,color,cost_performance):
    self.brand = brand
    self.color = color
    self.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 = brand
  print(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.carbrand
  File "/Users/htsc/Desktop/test.py", line 181, in carbrand
    raise False
  TypeError: exceptions must derive from BaseException

property函数

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


def carbrand(self):
  return self.brand

def carbrand_setter(self, brand):
  self.brand = brand
  print(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.newbrand
  File "/Users/htsc/Desktop/test.py", line 204, in carbrand_deleter
   raise False
 TypeError: exceptions must derive from BaseException

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

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

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

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


http://www.niftyadmin.cn/n/5327319.html

相关文章

Elasticsearch安装分词插件[ES系列] - 第499篇

历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 E…

OpenAI支持的实体机器人1x,获1亿美元融资

智能实体机器人1X在官网宣布&#xff0c;获得1亿美元B轮融资&#xff0c;本次由EQT Ventures、三星NEXT等投资。 资料显示&#xff0c;1X成立于2014年&#xff08;当时叫Halodi Robotics&#xff09;&#xff0c;总部位于挪威-莫斯。虽然成立时间很早&#xff0c;但发展并不顺…

实践学习PaddleScience飞桨科学工具包

实践学习PaddleScience飞桨科学工具包 动手实践&#xff0c;在实践中学习&#xff01;本项目可以在AIStudio平台一键运行&#xff01;地址&#xff1a;https://aistudio.baidu.com/projectdetail/4278591 本项目第一次执行会报错&#xff0c;再执行一次即可。若碰到莫名其妙的…

AMC8历年详细考点分类,都熟悉了考高分不成问题(2024年也适用)

还有四天&#xff0c;2024年AMC8美国数学思维活动&#xff08;竞赛&#xff09;就要正式开始了&#xff0c;这两天有多位家长咨询六分成长&#xff0c;想了解AMC8的主要考点&#xff0c;或者说经常考的内容。 根据2000-2023年这23年的真题分析&#xff0c;AMC8试题的考点可以分…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用短曝光功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用短曝光功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和短曝光功能的技术背景Baumer工业相机通过NEOAPI SDK使用短曝光功能1.引用合适的类文件2.通过NEOAPI SDK使用短曝光功能3.通过NEOAPI SDK关闭短…

Qt QGraphicsItem获取鼠标位置对应图像坐标

本次使用了QGraphicsView来加载图像&#xff0c;然后给其设置了一个QGraphicsScene场景&#xff0c;再给场景添加了一个自定义的QGraphicsItem&#xff0c;在其中重写了paint事件&#xff0c;用来重绘图像。 正常情况时&#xff0c;QGraphicsItem上图像的有效区域QRect大小和QG…

架构简介,到底什么是架构?

1. 前言 对技术人员来说&#xff0c;“架构”是一个再常见不过的词儿了。我们经常对新员工培训整个系统的架构&#xff0c;参加架构设计评审&#xff0c;学习业界开源系统&#xff08;例如&#xff0c;MySQL、Hadoop&#xff09;的架构&#xff0c;研究大公司的架构实现&#…

基于Ubuntu22.04部署生产级K8S集群v1.27(规划和核心组件部署篇)

本文档主要根据k8s官网文档和其插件的官网文档&#xff0c;参考部分他人优秀经验&#xff0c;在实际操作中逐渐完成&#xff0c;比较详尽&#xff0c;适合在境内学习者和实践者参考。 实操环境基于VMware Workstation 17 pro&#xff0c;采用ubuntu22.04操作系统&#xff08;有…