2015-06-14 31 views
2

如果我有一個文件,說first.py,它看起來像這樣 -獲取所有用戶定義的類文件中的

class Person(object): 
    pass 

class Dog(object): 
    pass 

,我有第二個文件,second.py。 如何獲得中定義的所有課程second.py

也許我應該提到,我想實現用例類似於Django的初始化模式,當這種情況發生的一個 - 當我運行manage.py sql myapp命令,我認爲Django的經過我的所有車型中models.py和爲它們生成一個SQL查詢。

所以我想要做的是類似於Django在models.py中定義的所有模型時所做的。

如何從文件中獲取所有用戶定義的類? (除非有更聰明的方法去做Django的工作)

在此先感謝!

+0

看起來像一個簡單的答案,這將是*寫*用戶定義的類,以符合一個特定的模式,即'類PersonCustom','DogCustom'等,或給每個一個屬性將其定義爲將在稍後動態收集的內容。 – erewok

回答

0

所有的django模型都是models.Model的子類,它有一個元類,它收集所有的模型子類。 一般來說,不可能獲得所有'用戶定義'類。

+0

這個答案的前半部分是真實的,但第二個不是。 –

+0

@Daniel能否詳細說明收集所有模型子類的元類? 這是如何完成的? – thomas

3

如果你有一個文件first.py,在second.py,你會寫下面的代碼在first.py返回所有用戶定義類:

import first 
from types import * 
userDefinedClasses = [i for i in dir(first) if type(getattr(first, i)) is TypeType] 

在您簡單的例子,預定義first.py,dir(第一個)將返回列表['Dog', 'Person', '__builtins__', '__doc__', '__file__', '__name__', '__package__']。要修剪它,你必須使用上面的壓縮for循環來檢查第一個目錄中每個對象的類型。

這將首先返回類型爲「type」的所有對象,這幾乎是所有用戶定義的類。

+0

這個解決方案的問題是它也會返回first.py中沒有明確定義的東西。 I.E如果我在first.py中導入了另一個模塊,那麼它也會顯示在您的代碼中,儘管沒有明確寫入first.py – thomas

相關問題