<p>如果<code>Undestroyable</code>是一个唯一的(或至少不寻常的)情况,那么重新定义<code>destroy()</code>可能是最简单的:</p>
<pre><code>class Undestroyable(Planet):
# ...
def destroy(self):
cls_name = self.__class__.__name__
raise AttributeError("%s has no attribute 'destroy'" % cls_name)
</code></pre>
<p>从类的用户的角度来看,这将表现为<code>Undestroyable.destroy()</code>不存在……除非他们使用<code>hasattr(Undestroyable, 'destroy')</code>四处寻找,这总是有可能的。在</p>
<p>如果您希望子类继承一些属性而不是其他属性,那么<a href="https://stackoverflow.com/a/43022264">chepner's answer</a>中的mixin方法可能更易于维护。您可以通过使<code>Destructible</code>和<a href="https://docs.python.org/3/library/abc.html" rel="nofollow noreferrer">abstract base class</a>来进一步改进它:</p>
^{pr2}$
<p>这样做的好处是,如果您尝试实例化抽象类<code>Destructible</code>,您将得到一个指向问题的错误:</p>
<pre><code>>>> Destructible()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Destructible with abstract methods destroy
</code></pre>
<p>…类似地,如果从<code>Destructible</code>继承,但忘记定义<code>destroy()</code>:</p>
<pre><code>class InscrutablePlanet(BasePlanet, Destructible):
pass
</code></pre>
<p/>
<pre><code>>>> InscrutablePlanet()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class InscrutablePlanet with abstract methods destroy
</code></pre>