2015-06-14 40 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

相关问题