Python对象访问性_04
访问可见性问题
在很多面向对象编程语言中,我们通常会将对象的属性设置为 私有的(private) 或 受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是 公开的(public),因为公开的方法就是对象能够接受的消息。在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头。
但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来妨碍对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们。
在实际开发中,我们并不建议将属性设置为私有的,所以大多数Python程序员会遵循一种命名惯例就是让 属性名以单下划线开头 来表示属性是受保护的,本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻。
虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,如果想访问属性可以通过属性的 getter(访问器) 和 setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用 @property包装器 来包装getter和setter方法,使得对属性的访问既安全又方便,如下。
class C:
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
对象具有 getter, setter 以及 deleter 方法(附加函数),它们可被用来创建对象特征属性的副本,通过调用这些方法来达到对属性进行操作的目的。如果 c 是 C 的实例,c.x 将调用getter,c.x = value 将调用setter, del c.x 将调用deleter。
注意:一定要给附加函数与原始的特征属性相同的名称 (在本例中为 x。)
参考博客或网址:
https://docs.python.org/zh-cn/3.9/library/functions.html#property
Python-100-Days