<p>Python不支持private或protected属性。您需要实现描述符协议。标准库提供了修饰符来简洁地实现这一点。在</p>
<p>只需在<strong>init</strong>方法中声明前面带有两个下划线的属性。它被称为name mangling,并阻止通过xusn访问属性,尽管在这种情况下,_Person_ussn仍然可以访问和修改属性。但是,如果不显式定义setter,它将引发AttributeError。在</p>
<p>当然,如果有人有滥用API的意图,如果他是非常有意图的话,他可以这样做。但这不是偶然的。在</p>
<pre><code>import re
class Person:
"""Encapsulates the private data of a person."""
_PATTERN = re.COMPILE(r'abcd-efgh-ssn')
def __init__(self, name, ssn):
"""Initializes Person class with input name of person and
his social security number (ssn).
"""
# you can add some type and value checking here for defensive programming
# or validation for the ssn using regex for example that raises an error
if not self._PATTERN.match(ssn):
raise ValueError('ssn is not valid')
self.__name = name
self.__ssn = snn
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name = value
@property
def ssn(self):
return self.__ssn
>>> p = Person('aname', 'abcd-efgh-ssn')
>>> p.ssn
'abcd-efgh-ssn'
>>> p.ssn = 'mistake'
AttributeError: 'can't set attribute'
</code></pre>