python

超轻量级php框架startmvc

python @propert装饰器使用方法原理解析

更新时间:2020-08-16 13:30:01 作者:startmvc
这篇文章主要介绍了python@propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细

这篇文章主要介绍了python @propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问。propert可以有两种用法:可以把一个方法变成只读属性;可以对一些属性进行过滤。

想象这样一个场景,在实例化一个类之后,需要对类的一个属性进行赋值,这时候是没有对属性属性被赋予的值进行判断的,如果属性被赋予了一个不合适的值,那么代码在后面执行的时候就会报错,为了避免这种情况,可以有两种方法解决。

一:设置一个方法,对属性值进行判断:


class Student():

 def get_score(self):
 return self._score

 def set_score(self, value):
 if not isinstance(value, int):
 raise ValueError('score must be an integer!')
 if value < 0 or value > 100:
 raise ValueError('score must between 0 ~ 100!')
 self._score = value  
if __name__ == '__main__': s = Student() s.set_score(value="88") print(s.get_score())

再Student类中,为了避免直接对 _score 属性操作,我们提供了 get_score 和 set_score 方法,这样起到了封装的作用,把一些不想对外公开的属性隐蔽起来,而只是提供方法给用户操作,在方法里面,我们可以检查参数的合理性等。这样做没什么问题,但是我们有更简单的方式来做这件事。

二:使用propert装饰器。


class Teacher():
 @property
 def score(self):
 return self._score

 @score.setter
 def score(self, value):
 if not isinstance(value, int):
 raise ValueError('score must be an integer!')
 if value < 0 or value > 100:
 raise ValueError('score must between 0 ~ 100!')
 self._score = value
if __name__ == '__main__':

 t = Teacher()
 t.score = 10
 print(t.score)
 t.score = 20
 print(t.score)

在上面,我们给方法 score 加上了 @property,于是我们可以把 score 当成一个属性来用,此时,又会创建一个新的装饰器 score.setter,它可以把被装饰的方法变成属性来赋值。

另外,我们也不一定要使用 score.setter 这个装饰器,这时 score 就变成一个只读属性了:


class test():
 def __init__(self, s1):
 self.s = s1

 @property
 def f1(self):
 return self.s

if __name__ == '__main__':

 t1 = test(s1=90)
 print(t1.f1)

注意:最后面一行的print(t1.f1)不要加括号,print(t1.f1()),要不会报错'int' object is not callable

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python propert 装饰器