9. 可见性与属性装饰器

在很多面向对象编程语言中,对象的属性通常会被设置为私有(private)或受保护(protected)的成员,简单的说就是不允许直接访问这些属性;对象的方法通常都是公开的(public),因为公开的方法是对象能够接受的消息。这就是所谓的访问可见性

在 Python 中,可以通过给对象属性名添加前缀下划线的方式来说明属性的访问可见性:

  • __name 表示一个私有属性
  • _name 表示一个受保护属性
python
class Student:

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def study(self, course_name):
        print(f'{self.__name}正在学习{course_name}.')


stu = Student('王大锤', 20)
stu.study('Python程序设计')
print(stu.__name)  # AttributeError: 'Student' object has no attribute '__name'

__ 开头的属性 __name 相当于是私有的,在类的外面无法直接访问,但是类里面的方法中可以通过 self.__name 访问该属性。

大多数程序员都认为开放比封闭要好,把对象的属性私有化并非必不可少的东西。所以 Python 语言并没有从语义上做出最严格的限定,如果你愿意,用 stu._Student__name 的方式仍然可以访问到私有属性 __name