python类成员保护和访问限制,及该设计的编程思想
类成员保护和访问限制有什么用
python类的成员可以通过“成员保护和访问限制的机制”非常大程度地禁止类实例对象对其进行直接访问和直接的修改,只能通过类实例方法来获取、访问或修改。
注意:这里之所以强调是“非常大程度地禁止”而不是完全禁止,是因为我们还是可以通过某种方法来直接访问受保护和访问限制的类成员,这可能是python的一个不完善的地方,这里不介绍这种方法了,因为类的成员保护和访问限制的设计的初衷应该不是为此,我们没必要通过那种方法来投机取巧,相反,我们更应该理解类成员保护和访问限制的编程思想。
python为什么要设计类成员保护和访问限制的功能呢
首先,我们通过一个通俗的实例来了解一下什么是类成员保护和访问限制的机制。
- 我们双击要访问电脑的回收站里头的文件,是不是会弹出个对话框,让我们把文件恢复到原来的位置,该过程我们可以理解为python类的成员保护和访问限制;
- 然后,我们删除电脑回收站里头的垃圾文件的时候,是不是也会弹出一个对话框,问我们是否真的要永久性地删除回收站里头的文件,这同样可以理解为python类的成员保护和访问限制;
- 在弹出的对话框,通常会有两个按钮,分别是确定与取消。当我们点击确定的时候,回收站的文件就可以被恢复到原来的位置,或被永久删除,这个过程,我们可以理解为python的类通过类的实例方法来访问类成员和修改类成员。
由此,我们大致可以将python类的成员保护和访问限制理解为是python对数据的一种保护机制。还有其他的运用场景,比如:人身份证上的名字是不能随便修改的,这样通过python类的成员保护和访问限制就可以很大程度上避免编程开发过程中一不小心将数据修改的。
成员保护和访问限制的语法
在成员的名字前加上两个英文的下划线__,如:
class Person():
def __init__(self, name):
self.__name = name #在成员前面加两个下划线,该成员成为受保护的成员,下面类的实例访问该成员被限制
p = Person('小明')
p.__name
——————————————————————————————
代码输出:
AttributeError Traceback (most recent call last)
<ipython-input-xxx> in <module>
4
5 p = person('小明')
----> 6 p.__name
AttributeError: 'person' object has no attribute '__name'
访问和修改受保护和访问限制的类成员
访问和修改这样的类成员,只需要通过类的实例方法就可以了,比如下面的实例:
class person():
def __init__(self, name):
self.__name = name
def get_name(self): #通过类实例方法的返回值,获取受保护的类成员
return self.__name
def set_name(self,name): #通过类实例方法,修改受保护的类成员
self.__name = name
p = person('小明')
print(p.get_name())
p.set_name('小强')
print(p.get_name())
——————————————————————————————
代码输出:
小明
小强
python类的保护和访问限制就先介绍到这里,下一章节我们将继续介绍python的@property装饰器。