跳转至

访问权限

Python 中通过命名限定访问权限,以两个下划线开头的成员为私有成员

class test(object):
    def __init__(self):
        self.__private='__private'

Test=test()
print(Test.__private)
AttributeError: 'test' object has no attribute '__private'

但事实上,Python 只不过是把所有私有成员重新命名了一下,在原来的名字前面加上了 _类名

我们知道了命名规则,一样可以在类外访问私有成员:

class test(object):
    def __init__(self):
        self.__private='__private'

Test=test()
print(Test._test__private) # 新的命名
__private

也就是说,Python 并没有从语法上严格保证私有成员的私密性,它只是给私有成员换了个名字来妨碍对它们的访问

之所以这样设定,可以用这样一句名言加以解释,就是

“ We are all consenting adults here ”

因为绝大多数程序员都认为开放比封闭要好,而且程序员要自己为自己的行为负责。

在实际开发中,我们通常 不将任何成员设置为私有的,因为这会导致子类无法访问。对于不希望在类外被访问的成员,一种惯例是 命名时以单下划线开头,提示该属性是受保护的,在类外访问时应慎重(还是能访问)

访问器 & 修改器

虽然不建议将属性设置为私有的,但如果直接将属性暴露给外界也是不合适的。比如,我们没有办法进行 合法性检查

这时,一般的处理方法是:遵循上面 以单下划线开头 的命名惯例,并为属性 包装 getter 和 setter 方法,这样就能使对属性的访问既安全又方便

class Person(object):
    def __init__(self):
        self._name=''

    # 访问器 - getter 方法
    @property
    def name(self):
        return self._name

    # 修改器 - setter 方法
    @name.setter
    def name(self,new_name):
        # 可在此加入合法性检测语句
        self._name=new_name

person=Person()
person.name='Harry'
print(person.name)

评论