Как мне перечислить все классы данного типа в файле Python? - PullRequest
0 голосов
/ 29 апреля 2010

Я использую django, и у меня длинный файл models.py.

class Foo(models.Model):
     name = models.CharField()

class Bar(models.Model):
     name = models.CharField()

class Fab(models.Model):
     name = models.CharField()

Есть ли способ составить список всех классов в файле, которые являются экземпляром (models.Model)?

Ответы [ 3 ]

4 голосов
/ 29 апреля 2010

Django предоставляет несколько служебных методов для получения классов моделей.

from django.db.models.loading import get_models, get_app
app = get_app('myappname')
models = get_models(app)
2 голосов
/ 29 апреля 2010

Когда вы говорите:

... классы в файле, которые являются экземпляром ...

я думаю, что вы имеете в виду "... классы в файле, которые являются подклассом ...". Если так:

classes = [cls for cls in dir(module)
           if issubbclass(getattr(module, cls), models.Model)]
1 голос
/ 29 апреля 2010

Модуль inspect может вам помочь. Вот некоторый код из написанного мной класса менеджера плагинов, который может служить примером.

def load_plugin_file(self, pathname):
    '''Return plugin classes in a plugin file.'''

    name, ext = os.path.splitext(os.path.basename(pathname))
    f = file(pathname, 'r')
    module = imp.load_module(name, f, pathname, 
                             ('.py', 'r', imp.PY_SOURCE))
    f.close()

    plugins = []
    for dummy, member in inspect.getmembers(module, inspect.isclass):
        if issubclass(member, Plugin):
            p = member(*self.plugin_arguments,
                       **self.plugin_keyword_arguments)
            if self.compatible_version(p.required_application_version):
                plugins.append(p)

    return plugins

Другой способ сделать это может быть использование встроенных функций globals, issubclass и isinstance.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...