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

时间:2015-06-20 19:14:14

标签: python python-2.x

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

例如:

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...

但这种语法无效。

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

1 个答案:

答案 0 :(得分:5)

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

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

class A(X):
    # definitions

也可以编写一个接受父类序列的元类,虽然这看起来有点矫枉过正:

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