<blockquote>
<p><sup><strong>Note</strong>: This post contains two different implementation techniques to allow for what you want.</sup></p>
</blockquote>
<hr/>
<h3>间接求解</h3>
<p>解决此问题的最简单方法是重构代码,使子类不直接重写公共接口使用的函数。在</p>
<p>相反,直接在基类中提供公共功能,并使子级重写所述函数的“worker”(<em>实现细节</em>),该函数稍后由从外部调用的函数调用。在</p>
<hr/>
<p><strong>示例实现</strong></p>
<pre><code>class Base (object):
def get_message (self):
try:
return self.get_message_impl ()
except Exception as detail:
print ("error:", detail)
return None
def get_message_impl (self):
raise Exception ("Not Implemented")
</code></pre>
^{pr2}$
<pre><code>class Bar (Base):
def get_message_impl (self):
raise Exception ("Bar.get_message_impl always fails!")
</code></pre>
<pre><code>f = Foo ()
b = Bar ()
f_msg = f.get_message ()
b_msg = b.get_message ()
print ("f_msg:", f_msg)
print ("b_msg:", b_msg)
</code></pre>
<p><sub><strong>输出</strong></sub></p>
<pre class="lang-none prettyprint-override"><code>error: Bar.get_message_impl always fails!
f_msg: Hello World
b_msg: None
</code></pre>
<hr/>
<hr/>
<h3>选择保护</h3>
<p>如果您希望保持重写基类中呈现的公共功能的可能性,同时在以后仍然能够轻松调用函数的<em>“protected”</em>版本,则可以创建一个简单的包装器,如下所示:</p>
<pre><code>class Base (object):
class Protected (object):
def __init__ (self, target):
self.target = target
def get_message (self):
try:
return self.target.get_message ()
except Exception as detail:
print ("error:", detail)
return None
def __init__ (self):
self.protected = self.Protected (self)
def get_message (self):
raise Exception ("Not Implemented")
</code></pre>
<pre><code>class Foo (Base):
def get_message (self):
return "Hello World";
</code></pre>
<pre><code>class Bar (Base):
def get_message (self):
raise Exception ("Bar.get_message_impl always fail!")
</code></pre>
<pre><code>f = Foo ()
b = Bar ()
f_msg = f.protected.get_message () # protected from failure
b_msg = b.protected.get_message () # protected from failure
b_msg = b.get_message () # will raise exception
</code></pre>