擅长:python、mysql、java
<p>一些面向对象的语言具有称为private的属性,这些属性不能从类方法外部访问。这一点很重要,因为有些属性不是要直接更改的,而是要作为其他属性的函数进行更改,或者在更改之前进行验证。在Python中,您没有<em>private</em>属性,但是您可以通过使用getter和setter来实现类似的功能,该变量以下划线开始—Python对私有方法和属性的约定。在</p>
<p>例如。矩形三角形的斜边由<code>h=sqrt(a*a+b*b)</code>给出,因此不能直接更改<code>h</code>,因为关系必须保持不变。另外,假设一个名称必须是<code>LASTNAME COMMA FIRSTNAME</code>格式,那么在分配<code>self.lastname</code>之前,必须验证是否是这样。在</p>
<p>属性getter允许您获取斜边,但禁止您设置斜边。属性设置器允许您设置属性,但您可以在实际设置属性之前进行检查。在</p>
<p>所以:</p>
<pre><code>class Person(object)
def __init__(self):
# The actual attribute is _name
self._name = None
@property
def name(self):
# when I ask for the name, I mean to get _name
return self._name
@name.setter
def name(self, value):
# before setting name I can ensure that it has the right format
if regex_name.match(value):
# assume you have a regular expression to check for the name
self._name = value
else:
raise ValueError('invalid name')
</code></pre>
<p>另一个例子:</p>
^{pr2}$