<h2>工厂函数体中的类定义</h2>
<p>去那里最简单的方法是真正的简单,但是会觉得有点尴尬:</p>
<pre class="lang-py prettyprint-override"><code>def derived_5_factory(Base):
class GenericDerived5(Base):
def calculate(self):
return super().calculate() + 5
return GenericDerived5
def derived_6_factory(Base):
class GenericDerived6(Base):
def calculate(self):
return super().calculate() + 6
return GenericDerived6
Derived5_1 = derived_5_factory(Derived1)
Derived6_2 = derived_6_factory(Derived2)
</code></pre>
<p>不方便的部分是您的类需要泛型基
必须在功能体内部定义。这样,Python将重新执行
<code>class </code>语句本身,使用不同的基,利用
Python类中的对象是第一类对象</p>
<p>该代码的不便之处在于:(1)类主体必须位于函数内部,(2)它可能是一种错误的方法:</p>
<h2>多重继承</h2>
<p>如果您可以有一个额外的继承级别——这是您的示例的唯一区别,那么这就是“正确”的方法。实际上,除了在继承链中显式地包含以前的“GenericDerivated”类外,它们的行为将完全符合预期:</p>
<pre class="lang-py prettyprint-override"><code>
class Base():
def calculate():
return 0
class Derived1(Base):
def calculate(self):
return 1
class Derived2(Base):
def calculate(self):
return 2
# mix-in bases:
class MixinDerived5(Base):
def calculate(self):
return super().calculate() + 5
class MixinDerived6(Base):
def calculate(self):
return super().calculate() + 6
Derived5_1 = type("Derived5_1", (MixinDerived5, Derived1), {})
Derived6_2 = type("Derived6_2", (MixinDerived6, Derived2), {})
</code></pre>
<p>这里,不使用<code>class</code>语句,而是使用<code>type</code>调用创建动态类,同时使用需要动态基的类和该动态基作为其<code>bases</code>参数。也就是说-<code>Derived5_1</code>是一个完全工作的Python类,在其继承链中有两个基</p>
<p>请注意,Python的<code>super()</code>将完全按照常识所期望的那样,在到达“基”之前,通过额外的中介“派生”类“重新路由”自己。这就是我在粘贴上面的代码后在交互控制台上得到的结果:</p>
<pre><code>In [6]: Derived5_1().calculate()
Out[6]: 6
In [7]: Derived6_2().calculate()
Out[7]: 8
</code></pre>