擅长:python、mysql、java
<p>一旦创建了已创建对象的实例,就不能对其进行真正的更改。当将<code>self</code>设置为其他值时,您所做的只是更改变量指向的引用,这样实际对象就不会受到影响。</p>
<p>这也解释了为什么不存在<code>title</code>属性。只要更改本地<code>self</code>变量,就会返回,从而阻止当前实例初始化<code>title</code>属性(更不用说,此时的<code>self</code>不会指向正确的实例)。</p>
<p>因此,基本上,在初始化期间(在<code>__init__</code>)不能更改对象,因为此时该对象已经创建并分配给变量。像<code>a = Page('test')</code>这样的构造函数调用实际上与:</p>
<pre><code>a = Page.__new__('test')
a.__init__('test')
</code></pre>
<p>如您所见,首先调用<code>__new__</code>类构造函数,而实际上是谁负责创建实例。所以您可以覆盖类‘<code>__new__</code>方法来操作对象创建。</p>
<p>但是,通常首选的方法是创建一个简单的工厂方法,如下所示:</p>
<pre><code>@classmethod
def create (cls, title, api = None):
o = cls.__getCache(title)
if o:
return o
return cls(title, api)
</code></pre>