2012-10-15 90 views
0

我在做這件事時遇到了一些麻煩。目前我有一個模塊,其中有一堆類,其中一些類將被修飾以指示某些事情。如何正確裝飾python中的類

我想創建一個新的,只包含裝飾類的假模塊。所以像這樣:

class FakeModule: pass 

def Decorator(cls): 
    attr = getattr(RealModule, cls) 
    setattr(FakeModule, cls, attr) 

有什麼建議嗎?我對python和python裝飾器相當陌生,所以我不確定正確的方法是什麼。

+1

我對您使用單詞「module」感到困惑。還有你想要完成的。爲什麼。 – Colleen

+0

基本上我有一堆測試類的文件。其中一些測試類將用@Decorator()進行修飾。 在其他地方,我有這樣的:FunctionWhichDoesStuffWithTestClasses(file_with_classes)。 我需要的是file_with_classes是'只'裝飾類,因此我試圖動態創建。 – user1161306

+0

1.你是什麼意思「測試」類 - 測試類,或更像「實踐」類? 2.我仍然不明白你想要完成什麼。你有沒有讀過任何裝飾文檔? http://wiki.python.org/moin/PythonDecorators – Colleen

回答

0

我想什麼是建立一個只包含裝飾類

一個新的,假的模塊,如果裝飾上設置一個類中的一些獨特的屬性或值,那麼你可以從得到的所有類模塊並使用它們進行過濾inspect模塊:

def is_decorated_class(cls, _sentinel=object()): 
    return (inspect.isclass(cls) and 
      getattr(cls, "some_attr", _sentinel) == value) 

name_class_pairs = inspect.getmembers(realmodule, is_decorated_class) 
+0

我已經或多或少地這樣做了,問題在於它是在裝飾事實之後發生的。 IE瀏覽器。裝飾所有類,設置屬性,然後再檢查屬性並決定加載它。我們需要它在裝飾時間(即在裝飾器方法本身中添加問題類) – user1161306

+0

@ user1161306:只需在裝飾器中調用'setattr(fakemodule,classname,classobject)'。 – jfs