我需要根据标志来决定派生哪些类。
例如:
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...
但这种语法无效。
(我知道有动态添加超类的技巧,但这种情况不同:它是定义时定制,而不是基类的完整动态重新定义)
答案 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