<p>您可以将python类视为代码的命名空间,并使用特殊绑定。你可以在类体中写几乎任何东西(考虑一个循环,为了更疯狂),它将在类导入时执行(实际上是在模块导入中)。唯一的问题是,在子类闭包中无法轻松访问父类(不使用元类)。你知道吗</p>
<p>所以,如果你需要快速而肮脏的补丁,你可以做<code>try/except</code>,比如:</p>
<pre><code>class Child(Parent):
try:
Parent.get_property
@property
def my_property(self):
return self.get_property()
@my_property.setter
def my_property(self, value):
self.set_property(value)
except:
pass
</code></pre>
<p>这个父类的第一个问题是硬编码的,如果更改继承,则需要更改实现。这实际上是一个糟糕的设计,但如果你几乎没有约束,也许它对你来说是好的。你知道吗</p>
<p>但更大的问题是,这样的接口很难使用。在大多数情况下,如果您提供属性/方法,您的用户将期望类具有此属性/方法。经常使用<code>if/else</code>或<code>try/except</code>并不是一件有趣的事,仅仅因为某个父类缺少方法。而这部分不能像你现在这样修复。你知道吗</p>
<p>所以,要考虑的主要问题是,当父类行为未知时,情况如何?如果它在安装时为用户所知,那么可以考虑提供两个不同的子类,内部没有任何意外。你知道吗</p>
<p>如果它只在运行时知道,为什么还要费心检查呢?用户仍将使用</p>
<pre><code>try:
child_obj.my_property
except AttributeError:
...
</code></pre>
<p>捕捉您的flappy接口,但有趣的是缺少父getter将产生相同的异常,非常简单</p>
<pre><code>class Child(Parent):
@property
def my_property(self):
return self.get_property()
@my_property.setter
def my_property(self, value):
self.set_property(value)
</code></pre>
<p>将使用几乎相同的</p>