Как отобразить определение класса в Python

Я задавал этот вопрос: Как мне вернуть определение класса в Python?

Но я не могу отобразить определение класса. Я получаю следующую ошибку:

>>> class A:
...     pass
...
>>> import inspect
>>> source_text = inspect.getsource(A)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 968, in getsource
    lines, lnum = getsourcelines(object)
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 955, in getsourcelines
    lines, lnum = findsource(object)
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 768, in findsource
    file = getsourcefile(object)
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 684, in getsourcefile
    filename = getfile(object)
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 654, in getfile
    raise TypeError('{!r} is a built-in class'.format(object))
TypeError: <module '__main__' (<_frozen_importlib_external.SourceFileLoader object at 0x0000026A79293F60>)> is a built-in class
>>>

Может кто-нибудь посоветовать, что я здесь делаю не так? Спасибо.

Есть ли в Python 3 классы старого стиля?

Chillie 06.09.2018 16:01

Зачем вам нужно видеть определение класса, который вы только что определили сами?

jonrsharpe 06.09.2018 16:02

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

Martijn Pieters 06.09.2018 16:02

@Chillie, я не совсем понимаю, что вы имеете в виду под классами старого стиля. Я могу определить классы без использования в python3

Forever Learner 06.09.2018 16:02

@ jonrsharpe, мне просто интересно узнать о концепции отображения определения класса. Скажем, я нахожусь в середине терминала и хочу знать членов класса, не живя в оболочке python, я новичок в python и пытаюсь изучить его.

Forever Learner 06.09.2018 16:04

@Chillie: это не имеет ничего общего с классами старого стиля. Я не уверен, насколько это уместно здесь.

Martijn Pieters 06.09.2018 16:04

@ForeverLearner, затем используйте dir(some_object). Он возвращает список атрибутов объекта и должен работать со статическими членами класса. Если вы также хотите увидеть значения, вы можете сделать some_object.__dict__.

0xdd 06.09.2018 16:04

@ForeverLearner Если вы хотите изучить, изучите документацию класса. Не его код. Конечно, вы можете найти членов класса, прочитав его исходный код, но вы не можете узнать, являются ли эти атрибуты внутренними или частью общедоступного API - если вы не читаете документацию.

Aran-Fey 06.09.2018 16:06

@Martijn Pieters, я попытался определить класс с подробностями, но все равно получил ту же ошибку >>> class MyClass: ... variable = "blah" ... def function (self): ... print ("Это сообщение внутри класса. ") ... >>> import inspect >>> source_text = inspect.getsource (MyClass)

Forever Learner 06.09.2018 16:07

@ForeverLearner: вы не можете использовать inspect.getsource() для всего, с чем не связан файл модуля. Python не хранит исходный код, а интерактивный интерпретатор - не файл модуля.

Martijn Pieters 06.09.2018 16:09

@jules и Мартин Питерс, хорошо. оригинальный ответ на вопрос показал этот трюк, поэтому мне было любопытно.

Forever Learner 06.09.2018 16:10

@ Aran-Fey, Да, я изучу документацию, я новичок в python и пытаюсь делать маленькие шаги. Тем не менее, спасибо за ваш вклад.

Forever Learner 06.09.2018 16:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
12
832
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция inspect.getsource() работает только при наличии текстовый файл, доступный для загрузки исходного кода.

Вы ввели определение класса в интерактивный интерпретатор, который не сохраняет исходный источник при компиляции этого источника в класс и объекты кода в памяти.

Поместите определение вашего класса в модуль, импортируйте модуль, и потом использует inspect.getsource().

inspect.getsource() работает, сначала находя модуль для данного объекта (для классов, просматривая атрибут ClassObj.__module__ для имени модуля, затем получая модуль через sys.modules[modulename]), затем проверяя, есть ли у модуля атрибут __file__, из которого можно получить читаемый исходный файл. определенный. Если такое имя файла существует и его можно прочитать, то модуль inspect считывает этот файл, чтобы затем найти строку class ClassName: и предоставить вам все строки с этой точки с одинаковым или более глубоким отступом. Интерактивный интерпретатор выполняет все в модуле __main__, и для интерпретатора нет атрибута __file__, поэтому любые попытки загрузить исходный код для определенных там объектов просто не удастся.

Если вы просто хотите знать, какие члены определяет класс, используйте вместо этого dir() или help() на объекте. Вам не нужно видеть полный исходный код для этой информации.

Принимая это как ответ, можно получить исходный код, если он определен в другом файле. Большое спасибо. >>> import mod1 >>> import inspect >>> source_text = inspect.getsource (mod1.MyClass) >>> print (source_text) class MyClass: variable = "blah" def function (self): print ("Это сообщение внутри класса. ") >>>

Forever Learner 06.09.2018 16:16

Другие вопросы по теме