擅长:python、mysql、java
<p>实际上你可以从一个函数返回一个类。您的语法错误是您使用class<strong>关键字</strong>,就好像它是一个可以调用的函数一样。在</p>
<p>请记住,所有的类块都是创建一个新类,然后将您选择的名称绑定到它(在当前范围内)。所以只要在函数中放入一个类块,然后返回类!在</p>
<pre><code>def mixinFactory(name, base, mixin):
class _tmp(base, mixin):
pass
_tmp.__name__ = name
return _tmp
</code></pre>
<p>如<a href="https://stackoverflow.com/a/9087212/42473">ejucovy</a>所述,您还可以直接调用<code>type</code>:</p>
^{pr2}$
<p>这是因为(通常)类块实际上是这样做的;它将类块中定义的所有名称收集到字典中,然后将类的名称、基类的元组和字典传递到<code>type</code>以构造新类。在</p>
<p>然而,<code>type</code>不过是默认元类</em>。类和其他对象一样是对象,是类的实例。大多数类都是<code>type</code>的实例,但是如果涉及到另一个元类,您应该调用它而不是{<cd1>},就像您不会调用{<cd6>}来创建类的新实例一样。在</p>
<p>mixin(大概)没有定义元类,因此它应该与<code>type</code>的子类的任何元类兼容。所以您可以使用<code>base</code>的任何类:</p>
<pre><code>def mixinFactory(name, base, mixin):
return base.__class__(name, (base, mixin), {})
</code></pre>
<p>然而,S.Lott的评论似乎真的是这个问题的最佳“答案”,除非你的mixin工厂正在做比创建一个新类更复杂的事情。与提出的任何动态类创建变体相比,这要清晰得多,类型更少:</p>
<pre><code>class NewClass(base, mixin):
pass
</code></pre>