2015-06-20 78 views
0

我需要根據標誌來決定從哪個類派生出來。以編程方式指定Python中的基類列表

例如:

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

但是這種語法是無效的。

(我知道有一種動態添加超的技巧,但這種情況下,不同的是:這是一個定義時間定製,而不是基類的一個全面的動態重新定義)

+2

你使用Python 2? – vaultah

+0

是的,抱歉,不準確。 Python 2.7 – codet

回答

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 
+0

完美!非常感謝 – codet

相關問題