如何在Python中显示类的定义

如何在Python中显示类的定义,python,class,definition,Python,Class,Definition,我正在讨论这个问题: 但是我无法显示类定义。我得到以下错误: >>> class A: ... pass ... >>> import inspect >>> source_text = inspect.getsource(A) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\**

我正在讨论这个问题:

但是我无法显示类定义。我得到以下错误:

>>> 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
>>>
>>A类:
...     通过
...
>>>进口检验
>>>source\u text=inspect.getsource(A)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Users\**\Python\Python36\lib\inspect.py”,第968行,在getsource中
行,lnum=getsourcelines(对象)
文件“C:\Users\**\Python\Python36\lib\inspect.py”,第955行,在getsourcelines中
行,lnum=findsource(对象)
文件“C:\Users\**\Python\Python36\lib\inspect.py”,第768行,位于findsource中
file=getsourcefile(对象)
文件“C:\Users\**\Python\Python36\lib\inspect.py”,第684行,在getsourcefile中
filename=getfile(对象)
getfile中第654行的文件“C:\Users\**\Python\Python36\lib\inspect.py”
raise TypeError(“{!r}是内置类”。格式(对象))
TypeError:是一个内置类
>>>

有人能告诉我我做错了什么吗?谢谢。

只有在有文本文件可用于加载源代码的情况下,
inspect.getsource()
函数才起作用

您在交互式解释器中键入了类的定义,在将原始源代码编译到内存中的类和代码对象时,该解释器不会保留原始源代码

将类定义放入模块中,导入模块,然后使用
inspect.getsource()

inspect.getsource()
首先查找给定对象的模块(对于类,通过查看模块名称的
ClassObj.\uuuuu module\uuuuuu
属性,然后通过
sys.modules[modulename]
获取模块)然后查看模块是否具有
\uuuuuuuuuuuuuuu
属性,从该属性可以确定可读的源文件。如果有这样一个文件名并且可以读取,那么
inspect
模块将读取该文件,然后搜索
类名:
行,并以相同或更深的缩进给出从该点开始的所有行。交互式解释器执行
\uuuuu main\uuuuuu
模块中的所有内容,并且解释器没有
\uuuuuuu file\uuuuuuu
属性,因此任何加载在该模块中定义的对象的源代码的尝试都将失败


如果您只是想知道类定义了哪些成员,请在对象上使用or。您不需要查看完整的源代码来获取这些信息。

只有在有文本文件可用于加载源代码的情况下,
inspect.getsource()
函数才有效

您在交互式解释器中键入了类的定义,在将原始源代码编译到内存中的类和代码对象时,该解释器不会保留原始源代码

将类定义放入模块中,导入模块,然后使用
inspect.getsource()

inspect.getsource()
首先查找给定对象的模块(对于类,通过查看模块名称的
ClassObj.\uuuuu module\uuuuuu
属性,然后通过
sys.modules[modulename]
获取模块)然后查看模块是否具有
\uuuuuuuuuuuuuuu
属性,从该属性可以确定可读的源文件。如果有这样一个文件名并且可以读取,那么
inspect
模块将读取该文件,然后搜索
类名:
行,并以相同或更深的缩进给出从该点开始的所有行。交互式解释器执行
\uuuuu main\uuuuuu
模块中的所有内容,并且解释器没有
\uuuuuuu file\uuuuuuu
属性,因此任何加载在该模块中定义的对象的源代码的尝试都将失败


如果您只是想知道类定义了哪些成员,请在对象上使用or。您不需要查看完整的源代码来获取这些信息。

python 3甚至有老式类吗?为什么您需要查看您自己刚刚定义的类的定义?您无法显示定义,因为没有可检索的源代码。@Chillie,我不确定您所说的老式类是什么意思。我可以在python3@jornsharpe中定义nad use类,我只是对显示类定义的概念感到好奇。假设我在终端的中间,想知道没有Python shell的类的成员,我是python新手,正在尝试探索python 3是否有旧样式的类?为什么您需要查看自己刚刚定义的类的定义?您无法显示定义,因为没有可检索的源代码。@Chillie,我不确定您所说的旧样式类是什么意思。我可以在python3@jornsharpe中定义nad use类,我只是对显示类定义的概念感到好奇。假设我在终端的中间,想知道这个类的成员而不使用Python shell,我是Python的新手,并尝试探索它接受这个答案,能够在另一个文件中定义源代码。非常感谢。>>>import mod1>>>import inspect>>source_text=inspect.getsource(mod1.MyClass)>>>print(source_text)class MyClass:variable=“blah”def function(self):print(“这是类中的一条消息”)>>>接受此答案,在另一个文件中定义时能够检索源代码。非常感谢。>>>import mod1>>>import inspect>>source_text=inspect.getsource(mod1.MyClass)>>>print(source_text)class MyClass:variable=“blah”def function(self):print(“这是类内的消息”)>>