访问权限¶
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)