关于python3面向对象里的getter和setter

python3 面向对象

最近看一份python的代码,发现里面有@property 一脸懵逼,我果然很菜,然后学习了一下关于python里的访问器和修改器。

class Person(object):
    def __init__(self, name, age):
        self._name = name
        self._age = age
    # 访问器 - getter方法
    @property
    def name(self):
        return self._name
    # 访问器 - getter方法
    @property
    def age(self):
        return self._age
    # 修改器 - setter方法
    @age.setter
    def age(self, age):
        self._age = age
    def play(self):
        if self._age < 18:
            print('%s 未成年' % self._name)
        else:
            print('%s成年' % self._name)

def main():
    person = Person('张三', 16)
    person.play()
    person.age = 22
    person.play()

if __name__ == '__main__':
    main()

当时就是看不懂,类里面本来就没有age这个变量,为什么main函数里面有这种赋值。
其实装饰器@property是将一个方法变成属性来使用,而@property又会创建另一个装饰器@age.setter,它负责把一个setter方法变成属性来赋值。
这和我直接赋值_age有什么区别呢,其实这可以为age确立一个范围,我们可以在setter里,限制一个人的岁数不小于0岁。这样属性就不会直接暴露在类外,相当于做了封装。如果想要设置属性只读,只需要不写setter的装饰器就好了。

你可能感兴趣的:(关于python3面向对象里的getter和setter)