@property
解决的问题:
- 调用方法像直接用属性一样直接简单。
思路:
- 将方法包安装成属性。
- 即对
def fun()方法进行包装。
- 即对
- 将方法包安装成属性。
Python内置的@property装饰器就是负责把一个方法变成属性调用的
==============================================
无@property
class Student(object):
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
分析:
- 一个
get_score方法, 一个set_score方法
>>> s = Student()
>>> s.set_score(60) # ok!
>>> s.get_score()
60
>>> s.set_score(9999)
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 100!
有@property
class Student(object):
# AA处get
@property
def score(self):
return self._score
# BB处set
@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
分析:
- 给score方法加上@property,self_score为实例的假私有属性。可能理解为:对score进行包装成Student的类属性。
- 给score方法又加上@score.setter。可以理解为:对.score方法当做属性用时去执行BB处的代码。(一般先有属性,再去设置改变属性)
- 把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作。
>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 100!
结论:
装饰后可以直接使用s.score,s.score=scoreNo;而不像无装饰前s.get_score(),s.set_score(60)那样将【设置参数放在括号里去设置】和【方法()】访问。
本文详细介绍了Python中@property装饰器的使用方法,包括如何通过@property将方法转变为类属性,简化对象属性的获取与设置过程,并确保数据的有效性验证。
1315

被折叠的 条评论
为什么被折叠?



