擅长:python、mysql、java
<p>使用<code>__new__</code>执行此操作的主要问题是,如果<code>FileClass.__new__</code>调用<code>TextFileClass</code>构造函数,<code>TextFileClass</code>如何启动实例以返回?你知道吗</p>
<p>为了解决这个问题,我们可以测试<code>cls</code>在<code>__new__</code>中是什么,这样我们就不会干扰子类<code>__new__</code>:</p>
<pre><code>def __new__(cls, filename):
if cls is FileClass:
return cls._factory(filename)
return super(FileClass, cls).__new__(cls, filename)
</code></pre>
<p>调用<code>FileClass('foo.txt')</code>时,如果对象是<code>FileClass</code>的实例,Python将对从<code>__new__</code>返回的对象调用<code>__init__</code>,因此我们必须使用<code>TextFileClass.__new__('foo.txt')</code>而不是<code>TextFileClass('foo.txt')</code>:</p>
<pre><code>@classmethod
def _factory(cls, filename):
if filename.endswith('.txt'):
return TextFileClass.__new__(filename)
elif filename.endswith('.rtf'):
return RTFFileClass.__new__(filename)
...
</code></pre>
<p>总之,这样做可能不值得。工厂函数或工厂方法更容易获得正确的结果。你知道吗</p>