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

posted @ 2022-08-10 20:05  Ganders  阅读(34)  评论(0编辑  收藏  举报