Я видел множество примеров людей, извлекающих все классы из модуля, обычно что-то вроде:
# foo.py
class Foo:
pass
# test.py
import inspect
import foo
for name, obj in inspect.getmembers(foo):
if inspect.isclass(obj):
print obj
Потрясающие.
Но я не могу узнать, как получить все классы из текущего модуля.
# foo.py
import inspect
class Foo:
pass
def print_classes():
for name, obj in inspect.getmembers(???): # what do I do here?
if inspect.isclass(obj):
print obj
# test.py
import foo
foo.print_classes()
Это, наверное, что-то действительно очевидное, но я не смог ничего найти. Может кто-нибудь мне помочь?
python
reflection
inspect
mcccclean
источник
источник
"class"
? Почему это не сработает?Ответы:
Попробуй это:
В вашем контексте:
И даже лучше:
Потому что
inspect.getmembers()
принимает предикат.источник
from optparse import OptionParser
), эти модули будут включены в список печати. Как я могу избежать этого?inspect.getmembers(sys.modules[__name__], lambda member: member.__module__ == __name__ and isnpect.isclass)
dict(inspect.getmembers(sys.modules[__name__])) == globals()
всегдаTrue
так зачем импорт?inspect.getmembers(sys.modules[__name__], lambda member: inspect.isclass(member) and member.__module__ == __name__
isclass
.Что о
?
источник
isinstance(obj, types.ClassType)
pudb
запускают вашу программу таким образом, что приводит кsys.modules
случайному сбою кода при отладке.globals()
кажется немного некрасивым, но это кажется намного более надежным.Я не знаю, есть ли «правильный» способ сделать это, но ваш фрагмент находится на правильном пути: просто добавьте
import foo
в foo.py, сделайтеinspect.getmembers(foo)
, и он должен работать нормально.источник
Я смог получить все, что мне нужно от
dir
встроенного плюсаgetattr
.Тем не менее, он выглядит как шарик:
источник
Обратите внимание, что модуль браузера класса Python stdlib использует статический анализ исходного кода, поэтому он работает только для модулей, которые поддерживаются реальным
.py
файлом.источник
Если вы хотите иметь все классы, принадлежащие текущему модулю, вы можете использовать это:
Если вы используете ответ Nadia и импортировали другие классы в свой модуль, эти классы также будут импортированы.
Вот почему
member.__module__ == __name__
он добавляется к предикату, используемому дляis_class_member
. Это утверждение проверяет, что класс действительно принадлежит модулю.Предикат - это функция (вызываемая), которая возвращает логическое значение.
источник
Другое решение, которое работает в Python 2 и 3:
источник
Это строка, которую я использую, чтобы получить все классы, которые были определены в текущем модуле (т.е. не импортированы). Согласно PEP-8, он немного длинный, но вы можете изменить его по своему усмотрению.
Это дает вам список имен классов. Если вы хотите, чтобы сами объекты класса просто оставляли объект obj.
Это было более полезным в моем опыте.
источник
источник
Я думаю, что вы можете сделать что-то подобное.
если вам нужны собственные занятия
источник
Я часто пишу утилиты командной строки, где первый аргумент предназначен для ссылки на один из множества различных классов. Например
./something.py feature command —-arguments
, гдеFeature
класс иcommand
метод этого класса. Вот базовый класс, который делает это легко.Предполагается, что этот базовый класс находится в каталоге вместе со всеми его подклассами. Затем вы можете позвонить,
ArgBaseClass(foo = bar).load_subclasses()
который вернет словарь. Например, если каталог выглядит так:Предполагая
feature.py
реализацииclass Feature(ArgBaseClass)
, тогда приведенный выше вызовload_subclasses
вернется{ 'feature' : <Feature object> }
. То же самоеkwargs
(foo = bar
) будет передано вFeature
класс.источник