(python)学习ing||类学习,@property装饰器
class pers():
def __init__(self,hp):
self._hp=hp
@property
def hp(self):
return self._hp
@hp.setter
def hp(self,hp):
self._hp=gp if hp>=0 else 0
a=pers(10)
print(a.hp)
a.hp-=15
print(a.hp)
# ~ a.hp(-5)#TypeError: 'int' object is not callable
# ~ print(a.hp)
'''
10
0
'''
来自bing AI的回答(手动修改后)
你好,这是必应。@property装饰器是一种用于定义和控制类属性的工具,它可以让你把一个方法变成一个属性,从而实现对属性的访问、设置和删除的自定义操作。
@property装饰器有以下几个优点:**
- 保护类的封装性,隐藏内部实现细节,防止属性被随意修改或删除。
- 简化代码,让方法可以像属性一样直接调用,不需要加括号。
- 提高性能,可以对属性的计算进行缓存,避免重复计算。
- 增加灵活性,可以根据需要动态地修改属性的行为和逻辑。
@property装饰器的基本用法是:**
- 在定义类属性的方法上一行,添加
@property,这样就把该方法变成了针对某属性的访问方法,可以直接通过该方法名获得该方法的返回值,而无需加括号,看起来就像是直接获取了某个属性的值。若方法名跟某个属性名相同,则看起来就像直接调用了该属性。而若返回值与该属性的值也相同,则就不仅仅是像了,那跟直接调用该属性效果就一样了。如下:@property
def 【方法名】():
return 【属性值】
为了能让方法内可以返回对象内属性的值,需要在对函数传入要返回的属性所在的对象,这样方法才能获取到属性的值并返回
@property
def 【方法名】(self):
return self.【属性名】
因为有了
@property,调用该方法时就可以只使用方法名而不加括号。看起来就像直接调用了某个属性,若方法名跟某个属性名相同,则看起来就像直接调用了该属性。
在函数内可以对属性的值进行一些判断和操作以防止返回了不合适的值,这样可以保证调用属性的时候调用出来的值是在预期内的。class fighter():
hp=100
@property
def hp(self):
return self.hp if self.hp>=0 else 0
aaa=fighter()
print(aaa.hp)
这样就保证了调用hp时返回的是非负数。
但是,像这样属性名与方法名完全相同的话,【对象名】.【方法名】与【对象名】.【属性名】就会混淆,实际上这样会导致无法再直接调用该属性,所有的【对象名】.【方法名】与【对象名】.【属性名】都会被认为是对该方法的调用,甚至def hp(self)内的return self.hp if self.hp>=0 else 0中的self.hp也会被认为是对hp方法的调用,这样就会变成递归了,而且还是没有出口的递归。于是上面的代码就会报错:[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
意思是(来自bing翻译):
[上一行重复了 996 次]
RecursionError:超出最大递归深度
所以方法名与该方法要返回的属性的名称不能完全相同,一般再该属性名前面加一个下划线
_,因为调用时最好方便简洁,调用时使用的是方法名,所以方法名最好就是要调用的属性最该有的名称,属性名前加一个下划线即可以与方法名区别也可以起到提示作用,提示该属性有专门的访问方法,最好不要直接调用。直接调用该属性则需要使用带下划线的名字,这样让原本不应该进行的直接调用行为变得特殊,可以起到提醒作用。最终例子如下:class fighter():
_hp=100
@property
def hp(self):
return self._hp if self._hp>=0 else 0
aaa=fighter()
print(aaa.hp)
输出为
100 - 在定义设置类属性的方法上,使用
@对应方法名.setter装饰器,这样就把该方法变成了针对某属性的赋值方法,可以直接通过该方法名与赋值运算符来进行传参,而不必使用括号,看起来就像直接对某个属性进行了赋值。class test():
_hp=100
@property
def hp(self):
return self._hp
@hp.setter
def hp(self,hp):
self._hp = hp if hp>=0 else 0
aaa=test()
print(aaa.hp)#100
aaa.hp=1
print(aaa.hp)#1
注意
@hp.setter中hp这一部分要与@property下面的方法名保持一致,因为setter是与property对应的一套东西这属于语法部分,错了会报错。但下面的方法名可以自己设,不过不能与方法内部的self.【属性名】中的属性名相同,要不然就又变成没有出口的递归了。至于其它的名字则没有问题,只是这个方法的作用是给某个属性赋值,所以还是和对应的@property方法相同最好。
上面aaa.hp=1实际是调用了def hp(self,hp)方法,并用赋值符号进行传参,将1传给了形参hp,在方法内部进行了赋值操作,将形参的值赋给了相应的属性的值 - 在定义删除类属性的方法上,使用@属性名.deleter装饰器,这样就把该方法变成了属性的deleter方法,可以通过del语句删除属性的值。
这个我还没用过,先不管它了
你可以参考以下链接来了解更多关于@property装饰器的详细信息和示例:
- Python @property装饰器详解 - 知乎
- Python 中 property() 函数及 @property 装饰器的使用 - CSDN博客
- 掌握Python属性控制的关键:深入了解@property装饰器 - CSDN博客
https://blog.csdn.net/guofei_fly/article/details/107827316.
希望这些信息对你有帮助。
(python)学习ing||类学习,@property装饰器的更多相关文章
- 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
- Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...
- python面向编程:类的组合、封装、property装饰器、多态
一.组合 二.封装 三.propert装饰器 四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 ...
- Python的property装饰器的基本用法
Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- [转载]Python使用@property装饰器--getter和setter方法变成属性
原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和sette ...
- 【python】@property装饰器
Python内置的@property装饰器可以把类的方法伪装成属性调用的方式.也就是本来是Foo.func()的调用方法,变成Foo.func的方式.在很多场合下,这是一种非常有用的机制. class ...
- python staticmethod,classmethod方法的使用和区别以及property装饰器的作用
class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) @st ...
- python中@property装饰器的使用
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...
- python面向对象:组合、封装、property装饰器、多态
一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. ...
随机推荐
- vue学习笔记 九、父子组件实例-基本结构
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- Vue+Element前端导入导出Excel
1 <el-upload 2 class="upload-demo" 3 :action="uploadUrl()" 4 :limit="1&q ...
- Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件
Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件 之前有提到过我们项目部现在正在用Qt重构一个大型软件,现在的情景是这样的: 原先的软件是通过一个C++(CLR)的主程序,调用各种用 ...
- freeswitch的gateway配置方案优化
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在之前的文章中,我们简单介绍过gateway的三种配置方案,但是实际应用之后发现,方案中的参数设置有缺陷,会导致一些问题. 本文档中 ...
- ASP.NET Core 5.0 MVC 视图组件的用法
什么是视图组件 视图组件与分部视图类似,但它们的功能更加强大. 视图组件不使用模型绑定,并且仅依赖调用时提供的数据.它也适用于 Razor 页. 视图组件: 呈现一个区块而不是整个响应. 包括控制器和 ...
- ACP 知识点总结
记录下学习ACP过程不断遇到的且需要记录的知识点: 在阿里云专有网络VPC创建之后,路由器也是随着VPC一起自动创建,所以不需要手动创建,这个时候需要继续创建交换机才能在交换机种创建其他云产品. 7层 ...
- 【js】 Object.prototype.toString.call()
1,Object.prototype.toString这个方法的作用是什么 判断数据类型 2,为什么要用这个方法 是因为 js 中 一般的类型判断 对于 null,数组,对象 , 都会返回一样的结 ...
- K8S增加限制后的启动时间验证
K8S增加限制后的启动时间验证 背景 前段时间看了下JVM载linux上面的启动时间, 进行过一些验证. 最近想着能够验证一下K8S上面的启动相关的信息 所以就整理了一下. 虽然没有特别好的结论, 但 ...
- [转帖]Prometheus-使用python开发exporter
exporter有很多,但想要特定需求的话,还需自行开发.在这里使用python写一个exporter,用于监控/root下的目录数量. 开发exporter需要使用prometheus_client ...
- [转帖]Linux命令(51)——ipcs命令
https://cloud.tencent.com/developer/article/1380589 1.命令简介 ipcs命令用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表.共享 ...