以编程方式在 Python 中指定基数 类 的列表

Specifying the list of base classes in Python programmatically

我需要根据标志来决定 类 从哪个派生。

例如:

if SOME_FLAG:
   class A(B,C):
      ...definitions...
else:
   class A(B):
      ...definitions...

问题是如何避免重复 ...definitions...

我尝试像对普通函数那样使用参数列表,但它不适用于 类:

base_classes = [B,C] if SOME_FLAG else [B]
class A(*base_classes):
   ...definitions...

但是这个语法是无效的。

(我知道有动态添加 super类 的技巧,但这种情况不同:它是定义时自定义,而不是 base 类 的完全动态重新定义)

最简单的方法可能是有条件地定义一个中间值 class,然后从中导出 class A

X = B
if SOME_FLAG:
   class X(B, C): pass

class A(X):
    # definitions

也可以编写一个接受父 class 序列的元class,尽管这看起来有点过分:

def meta(name, bases, dict):
    if len(bases) == 1 and isinstance(bases[0], (tuple, list)):
        bases = bases[0]
    return type(name, bases, dict)

parents = (B, C) if SOME_FLAG else B

# Python 3
class A(parents, metaclass=meta):
    # definitions

# Python 2
class A(parents):
    __metaclass__ = meta
    # definitions