Python @property属性总结

刚开始接触@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属性值

猜你喜欢

转载自www.cnblogs.com/Rongze-blog/p/9582196.html