Я задавал этот вопрос: Как мне вернуть определение класса в 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
>>>
Может кто-нибудь посоветовать, что я здесь делаю не так? Спасибо.
Зачем вам нужно видеть определение класса, который вы только что определили сами?
Вы не можете показать определение, потому что не осталось исходного кода для извлечения.
@Chillie, я не совсем понимаю, что вы имеете в виду под классами старого стиля. Я могу определить классы без использования в python3
@ jonrsharpe, мне просто интересно узнать о концепции отображения определения класса. Скажем, я нахожусь в середине терминала и хочу знать членов класса, не живя в оболочке python, я новичок в python и пытаюсь изучить его.
@Chillie: это не имеет ничего общего с классами старого стиля. Я не уверен, насколько это уместно здесь.
@ForeverLearner, затем используйте dir(some_object). Он возвращает список атрибутов объекта и должен работать со статическими членами класса. Если вы также хотите увидеть значения, вы можете сделать some_object.__dict__.
@ForeverLearner Если вы хотите изучить, изучите документацию класса. Не его код. Конечно, вы можете найти членов класса, прочитав его исходный код, но вы не можете узнать, являются ли эти атрибуты внутренними или частью общедоступного API - если вы не читаете документацию.
@Martijn Pieters, я попытался определить класс с подробностями, но все равно получил ту же ошибку >>> class MyClass: ... variable = "blah" ... def function (self): ... print ("Это сообщение внутри класса. ") ... >>> import inspect >>> source_text = inspect.getsource (MyClass)
@ForeverLearner: вы не можете использовать inspect.getsource() для всего, с чем не связан файл модуля. Python не хранит исходный код, а интерактивный интерпретатор - не файл модуля.
@jules и Мартин Питерс, хорошо. оригинальный ответ на вопрос показал этот трюк, поэтому мне было любопытно.
@ Aran-Fey, Да, я изучу документацию, я новичок в python и пытаюсь делать маленькие шаги. Тем не менее, спасибо за ваш вклад.






Функция 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 ("Это сообщение внутри класса. ") >>>
Есть ли в Python 3 классы старого стиля?