刚开始接触@property属性确实被网上很多人的文章搞得有点晕头转向
每个人对@property属性的作用和价值都有不同的侧重,使得我们很多菜鸟搞不清楚它到底是干啥的
在浏览了很多人的帖子后,大致总结归纳了一下@property属性的作用和用法,希望能对大家有所帮助
首先假设我们要给Tony这个对象存一个score属性,我们可能直接会想到,像下面这样做
# 例1
class Student(): def __init__(self, score): self.score = score Tony = Student(95) # 1 print(Tony.score) Tony.score = 100 # 2 print(Tony.score)
执行结果为
95 100
#1的位置很好理解,但是#2的位置出现不规范或者说不安全的地方
假如要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
,将变量变成了一个私有变量,只有内部可以访问,外部不能访问
确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
修改后的代码如下
class Student():
def __init__(self, score):
self.__score = score
def get_score(self): # 3
return self.__score
def set_score(self, value): # 4
if not isinstance(value, int):
raise ValueError('分数必须是整数才行呐')
if value < 0 or value > 100:
raise ValueError('分数必须0-100之间')
self._score = value
Tony = Student(95)
print(Tony._Student__score) # 5
print(Tony.get_score())
Tony.set_score(100)
print(Tony.get_score())
执行结果为
95
95
100
这里在#5位置如果替换成print(Tony.score)就会报错了,因为__score是私有变量,外部不能访问
当然你可以通过#5位置Tony._Student__score方式访问
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__score改成不同的变量名。
我们其实可以通过#3位置一个get_score函数获取到__score
而且可以通过#5位置一个set_score函数对__score进行修改和检查
接下来,这里划重点!划重点!划重点!
如果我们就希望
1.通过 print(Tony.score)访问__score值呢,而不是采用Tony._Student__score?
2.通过Tony.score = 100修改__score值呢, 而不是通过Tony.get_score()?
答:用@property
修改代码如下
class Student(): def __init__(self, score): self.__score = score @property def score(self): return self.__score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('分数必须是整数才行呐') if value < 0 or value > 100: raise ValueError('分数必须0-100之间') self.__score = value Tony = Student(95) print(Tony.score) Tony.score = 100 print(Tony.score)
执行结果为
95 100
总结使用@property的作用如下
1.可在使用__score私有化变量的情况下,规范(没有使用Tony._Student__score),简洁(没有使用get_score函数)地读取__score属性值
2.可以检查修改数据是否规范,并简洁(没有使用set_score函数)地修改__score属性值