2013-06-05 24 views
1

我有一個工廠函數,它定義了幾個類並將它們返回到列表中。是否有可能獲得這樣一個列表,其中的類按其定義的順序出現?按照定義的順序獲取範圍對象

以下工廠使用locals()來獲取其範圍中定義的類,但locals()返回字典,因此沒有明確的排序。

import inspect 

def factory() : 
    class Base(object): 
     pass 

    class A(Base): 
     pass 

    class B(Base): 
     pass 

    class C(Base): 
     pass 

    local_classes = [obj for obj in locals().values() if inspect.isclass(obj)] 
    return [cls for cls in local_classes if issubclass(cls, Base)] 

factory() 
# [<class '__main__.A'>, <class '__main__.Base'>, <class '__main__.C'>, <class '__main__.B'>] 

所需的輸出將

# [<class '__main__.Base'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>] 
+2

不,不無反思的源代碼和猜測從該訂單。你爲什麼需要一個特定的訂單? –

+0

類中模型組件的順序很重要,我寧願不必在類定義中指定每個組件的位置。 –

回答

1

我遇到這個問題了幾次。我的解決方案通常使用類裝飾器來明確地將每個類添加到工廠。

我通常使用工廠類的實例作爲工廠。不過,如果你情況下,從列表導出可能足以實現你的目標的一個簡單的工廠類:

class Factory (list): 
    def append(self, cls): 
     super(Factory, self).append(cls) 
     return cls 

factory = Factory() 

@factory.append 
class Base (object): 
    pass 

@factory.append 
class A (Base): 
    pass 

@factory.append 
class B (Base): 
    pass 
print factory 

運行該收益率:

[<class '__main__.Base'>, <class '__main__.A'>, <class '__main__.B'>] 
+0

謝謝,這聽起來很有希望。小心添加一個小例子? –

+0

@MatthewPlourde我爲你添加了一個簡單工廠的例子。 – Ber

+0

非常好,謝謝。 –

相關問題