擅长:python、mysql、java
<p>通常,在Python中不使用getter和setters;除非需要转换值,在设置或获取期间需要副作用,或者需要阻止获取或设置,否则只需使用属性:</p>
<pre><code>class MyClass(object):
def __init__(self, member):
self.member = member
</code></pre>
<p>实例属性与类属性是分开的;在<code>self</code>上设置属性意味着您正在操作实例,类(<code>MyClass.member</code>)上的属性是类属性,因此在实例之间共享。这是通过在查找属性时使用类作为后备来实现的;首先查询实例,然后查询实例的类,然后查询类的基类;设置<code>self.member</code>意味着任何{<cd2>}在实例上不再可见。在</p>
<p>从技术上讲,<code>__init__</code>方法实际上不是构造函数。^调用<code>__init__</code>时,{<cd1>}已存在。它是一个初始值设定项,你可以用它来设置第一个值。如果需要实际的构造函数(实例工厂),则需要查找<a href="http://docs.python.org/2/reference/datamodel.html#object.__new__" rel="nofollow">^{<cd8>} static method</a>。注意,在PHP中,<code>__construct</code>也是一个初始值设定项,而不是构造函数!在</p>
<p>对于那些需要创建setter和getter的情况,请使用<a href="http://docs.python.org/2/library/functions.html#property" rel="nofollow">^{<cd10>} decorator function</a>:</p>
^{pr2}$
<p>演示:</p>
<pre><code>>>> m = MyClass('World')
>>> m.member
'Hello World!'
>>> m.member = 'Hello Planet Earth!'
>>> m.member
'Hello Planet Earth!'
>>> m._member
'Planet Earth'
</code></pre>