关于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()

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

    推荐阅读