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

news2024/11/19 17:35:38

   

   之前文章我们介绍了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.coloradmin.cn/o/1375571.html

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

相关文章

Linux第24步_安装windows下的VisualStudioCode软件

Visual Stuio Code是一个编辑器&#xff0c;简称 为 VSCode&#xff0c;它是微软出的一款免费编辑器。 VSCode有 Windows、 Linux和 macOS三个版本的&#xff0c;是一个跨平台的编辑器。VSCodeUserSetup-x64-1.50.1是Windows系统中的VSCode软件&#xff0c;而“code_1.50.1-160…

大创项目推荐 深度学习手势识别算法实现 - opencv python

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习手势识别算法实现 - opencv python 该项目较为新颖…

212. 单词搜索 II(字典树的另一种类型)

大致思路是&#xff1a; 根据words列表建立字典树&#xff0c;其中注意在单词末尾&#xff0c;将原来的isEnd变量换成存储这个单词的变量&#xff0c;方便存储到ans中&#xff0c;另外&#xff0c;字典树的字节点由原来的Trie数组变为hashmap&#xff0c;方便检索字母。 建立…

React之自定义路由组件

开篇 react router功能很强大&#xff0c;可以根据路径配置对应容器组件。做到组件的局部刷新&#xff0c;接下来我会基于react实现一个简单的路由组件。 代码 自定义路由组件 import {useEffect, useState} from "react"; import React from react // 路由配置 e…

(超详细)4-YOLOV5改进-添加ShuffleAttention注意力机制

1、在yolov5/models下面新建一个SE.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import numpy as np import torch from torch import nn from torch.nn import init from torch.nn.parameter import Parameterclass ShuffleAttention(nn.Module):def __…

软件测试|使用Python打印五子棋棋盘

简介 五子棋是我们传统的益智类游戏&#xff0c;在制作五子棋时&#xff0c;我们需要先将棋盘打印出来&#xff0c;本文就来介绍一下使用Python打印五子棋棋盘。 步骤一&#xff1a;打印空棋盘 首先&#xff0c;我们需要在Python中定义一个棋盘函数&#xff0c;该函数将打印…

Confluence跨大版本升级记录

初始版本7.4.18最终升级到了目前的最新版本8.7.1&#xff0c;在升级过程中遇到了很多问题&#xff0c;庆幸的是最后都解决了&#xff0c;记录一下。 背景 初始环境&#xff1a; OS&#xff1a;CentOS8.5 DB&#xff1a;10.8.8-MariaDB Confluence&#xff1a;7.4.18 公司…

数据驱动下的LLM优化:如何从数据集中发掘最大价值?

来源&#xff0c;公众号&#xff1a;芝士AI吃鱼 本文聚焦于通过使用精心策划的数据集对LLM进行微调&#xff0c;以提升其建模性能。具体来说&#xff0c;本文强调了涉及修改、使用或操纵数据集进行基于指令的微调的策略&#xff0c;而不是改变模型架构或训练算法。本文还将解释…

STL源码阅读总结从小白到大神:vector

一、vector概述 vector的数据格式与array非常相似&#xff0c;两者的差别在于空间的灵活运用&#xff0c;array是静态空间&#xff0c;一旦配置内存空间就不容易更改原来的空间大小。而vector是动态空间&#xff0c;随着元素的加入&#xff0c;它的内部机制就会自动扩容以容纳…

【LeetCode:200. 岛屿数量 | DFS 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

JavaEE中的Controller的每一个Handler如何确定返回值与形参?

在JavaEE中&#xff0c;特别是在基于Spring框架的JavaEE应用中&#xff0c;Controller是用来处理HTTP请求的组件。Controller中的每一个Handler方法都是负责处理特定的请求&#xff0c;并确定返回值与形参。以下是一般情况下的Handler方法的确定返回值与形参的详细说明&#xf…

电子雨代码-html

电子雨代码 动画效果展示 代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Code</title><style>body {margin: 0;overflow: hidden;}</style></head><body><ca…

鸿蒙Harmony--状态管理器--@Prop详解

纵横千里独行客&#xff0c;何惧前路雨潇潇。夜半浊酒慰寂寞&#xff0c;天明走马入红尘。且将新火试新茶&#xff0c;诗酒趁年华。青春以末&#xff0c;壮志照旧&#xff0c;生活以悟&#xff0c;前路未明。时间善变&#xff0c;可执着翻不了篇。时光磨我少年心&#xff0c;却…

c++学习第九讲---类和对象---多态

多态&#xff1a; 1.多态的基本概念&#xff1a; &#xff08;1&#xff09;多态分为两类&#xff1a; 静态多态&#xff1a;函数重载和运算符重载&#xff1b; 动态多态&#xff1a;派生类和虚函数实现运行时多态。 &#xff08;2&#xff09;静态多态和动态多态的区别&am…

动态规划day03

343. 整数拆分(第二次做还是没弄明白) 力扣题目链接(opens new window) 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: …

了解特权身份管理(PIM)的基础知识

要了解特权身份&#xff0c;首先必须确定身份是什么&#xff0c;管理员可用于验证属于网络的用户的真实性的任何形式的唯一身份验证都是身份&#xff0c;这些包括密码、用户名、员工 ID、手机号码、安全答案等。 这些身份通常存储在 Active Directory 等目录中&#xff0c;并使…

EM planner 论文阅读

论文题目&#xff1a;Baidu Apollo EM Motion Planner 0 前言 EM和Lattice算法对比 EM plannerLattice Planner参数较多&#xff08;DP/QP&#xff0c;Path/Speed&#xff09;参数少且统一化流程复杂流程简单单周期解空间受限简单场景解空间较大能适应复杂场景适合简单场景 …

【分布式技术】rsync远程同步服务

目录 一、rsync&#xff08;远程同步&#xff09; 二、实操rsync远程文件同步 准备一个服务端192.168.20.18以及一个客户端192.168.20.30 1、服务端搭建&#xff1a;先完成服务端配置&#xff0c;启动服务 rsync拓展 1、关于rsyncd服务的端口号 2、rsync和scp的区别 2、测…

企业级进销存管理系统

框架&#xff1a; 进销存管理系统&#xff0c;采用SpringBootShiroMyBatisEasyUI 项目采用Maven构建&#xff0c;数据库文件存放在 sql/jxc.sql 截图 运行项目部分截图&#xff0c; 登录界面&#xff0c;用户名admin&#xff0c;密码admin123 当前库存查询&#xff0c; 进…

UI自动化测试工具对企业具有重要意义

随着软件行业的不断发展&#xff0c;企业对高质量、高效率的软件交付有着越来越高的要求。在这个背景下&#xff0c;UI自动化测试工具成为了企业不可或缺的一部分。以下是UI自动化测试工具对企业的重要作用&#xff1a; 1. 提高软件质量 UI自动化测试工具能够模拟用户的操作&am…