2013-05-28 34 views
1

一般情況:查找特定類從任何給定的模塊

  • 我不知道是什麼模塊我會事先檢查,我不知道會是他們什麼:類,方法,等
  • 我知道我正在尋找什麼課,以及我需要做什麼。例如我需要運行一個特定的方法,cls.register
  • 我需要找到最有效的方法來做到這一點。

我還沒有得到特定的代碼,或我會發布它。不過,我覺得我有一些選項:

  1. 剛剛經歷try/except
  2. if/else運行模塊中的一切尋找我需要
  3. 使用檢查發現的類的完全匹配的方法模塊
  4. 使用元類添加屬性this_is_class_sought=True

1-3顯得太粗,4似乎這太費勁了。

我的情況:

我試圖整合瓶,優雅與an application creator/factory
我有一堆視圖文件,我不知道這些文件會是什麼。我需要找到FlaskView子類的所有類,而不是FlaskView本身,然後運行類註冊函數。

因此,例如從dir(a_module)用於隨機遇到模塊:

['FlaskView', 'AView', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'forms', 'models', 'redirect', 'render_template', 'request', 'url_for']

我需要確定AView是存在的,並運行該配準方法。 3,上面看起來很可能,但我還沒有完全確定如何區分AView

這樣做的最好方法是什麼?

編輯:

我必須強調的是,整個的一點是,我不知道我會看什麼模塊,否則將包含的內容。我需要根據這些信息有效地提取我需要的信息並採取行動。

EDIT2:

__subclasses __()簡化了很多,我的目的。

+0

正常的做法是將所有這些類明確地導入到主模塊中。使所有這些導入語句保持最新將比編寫一些在運行時爲您執行它的魔術代碼花費更少的工作量。 –

+0

我也許沒有強調的一點:我不知道我會得到什麼模塊或意見。我*知道*顯式導入模塊會更容易,但我不會事先知道我將使用哪些模塊,它們將包含哪些視圖或它們將包含多少視圖。 – blueblank

回答

0

聽起來就像你試圖做一些哈克,但...無論如何我會幫忙的。如果選項4是一個選項,我會推薦使用自注冊的元類/基類。

看看這個答案:Generic Python metaclass to keep track of subclasses

複製的完整性

或者,只是通過它的循環與一些issubclassisinstance應該做的伎倆。一般來說你不需要任何嘗試/除了這裏,但爲了安全起見,你可以添加一些。

+0

http://pythonwise.blogspot.com/2009/03/subclasses.html – blueblank

+0

@blueblank:不知道,甜蜜:) – Wolph