当前位置: 首页 > 科技观察

Python装饰器中的@property

时间:2023-03-12 19:19:04 科技观察

分析1、利用@property的优势,将类方法转化为类属性,可用于直接获取属性值或为属性赋值。案例研究示例:classExam(object):def__init__(self,score):self._score=scoredefget_score(self):returnself._scoredefset_score(self,val):ifval<0:self._score=0elifval>100:self._score=100else:self._score=vale=Exam(60)print(e.get_score())e.set_score(70)print(e.get_score())代码分析:定义了一个Exam类,为了避免直接_scoreattribute操作提供了get_score和set_score方法,起到封装的作用,隐藏一些不想对外公开的属性,只提供方法供用户操作。该方法可以检查参数的合理性。Python提供了一个属性装饰器,被装饰的方法可以“作为”一个属性。示例:classExam(object):def__init__(self,score):self._score=score@propertydefscore(self):returnself._score@score.setterdefscore(self,val):ifval<0:self._score=0elifval>100:self._score=100else:self._score=vale=Exam(60)print(e.score)e.score=90print(e.score)e.score=200print(e.score)注:添加方法score@property,因此分数可以用作属性。这时候会创建一个新的score.setter,可以把被装饰的方法变成一个属性进行赋值。另外,不需要使用装饰器score.setter,那么score就变成只读属性:classExam(object):def__init__(self,score):self._score=score@propertydefscore(self):returnsself。_scoree=Exam(60)print(e.score)e.score=200#score是只读属性,不能设置值print(e.score)2.@property的威力python处理方式以上问题是使用属性。可以这样实现。示例:classCelsius:def__init__(self,temperature=0):self.temperature=temperaturedefto_fahrenheit(self):return(self.temperature*1.8)+32defget_temperature(self):print("获得的值")returnsself._temperaturedefset_temperature(self,value):ifvalue<-273:raiseValueError("minus273degreesisnotpossible")print("setvalue")self._temperature=valuetemperature=property(get_temperature,set_temperature)运行后,在shell代码中发出以下命令。c=Celsius()print(c.temperature)创建对象时,将调用init()方法。此方法的行是self.temperature=temperature。此分配自动调用set_temperature()。2.属性的作用。对c.temperature的任何访问都会自动调用get_temperature()。示例:c.temperature=37print(c.temperature)print(c.to_fahrenheit())注意:温度值存储在私有变量_temperature中。temperature属性是一个属性对象,它为这个私有变量提供了一个接口。3、深入理解property在Python中,property()是一个内置函数,用于创建和返回属性对象。语法property(fget=None,fset=None,fdel=None,doc=None)参数解析fget是获取属性值的函数,fset是设置属性值的函数,fdel是删除属性的函数,doc是一个字符串(如评论)。从实现中可以看出,这些函数参数是可选的。属性对象可以简单地创建如下。property(fget=None,fset=None,fdel=None,doc=None)print(property())1、property对象有getter()、setter()和deleter()三个方法。语法:temperature=property(get_temperature,set_temperature)用于后面指定fget、fset和fdel。#createemptypropertytemperature=property()#setfgettemperature=temperature.getter(get_temperature)#setfsettemperature=temperature.setter(set_temperature)注意:这两段代码是等价的。未定义名称get_temperature、set_temperature。因为它们是不必要的并且会影响类命名空间。为此,在定义getter和setter函数时会重用名称温度。2.例子:classCelsius:def__init__(self,temperature=0):self._temperature=temperaturedefto_fahrenheit(self):return(self.temperature*1.8)+32@propertydeftemperature(self):print("获得的值")returnself._temperature@temperature.setterdeftemperature(self,value):ifvalue<-273:raiseValueError("负273度是不可能的")print("负273度是不可能的")self._temperature=valuec=Celsius()c.temperature=37print(c.temperature)注意:实现是制作属性的简单且推荐的方法。在Python中查找属性时,您很可能会遇到这些类型的构造。4.小结本文基于Python基础,介绍@property如何将方法转化为属性。通过案例的分析,代码的展示。介绍@property的强大功能,并提供相应的错误解决处理方法。属性的作用。欢迎大家积极尝试。有时候看别人实现很简单,但是到了自己实现的时候,总会出现各种各样的问题。不要野心太大,努力理解得更深刻。代码很简单,希望对大家学习有所帮助。