如何在Python中显示类的定义

时间:2018-09-06 14:00:45

标签: python class definition

我正在经历以下问题:How do I return the definition of a class in 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
>>>

有人可以告诉我我在做什么错吗?谢谢。

1 个答案:

答案 0 :(得分:6)

inspect.getsource()函数仅在有文本文件可用于加载源代码时起作用。

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

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

inspect.getsource()的工作方式是:首先找到给定对象的模块(对于类,通过查看模块名称的ClassObj.__module__属性,然后通过sys.modules[modulename]获取模块),然后如果模块具有__file__属性,可以从中确定可读的源文件。如果有这样的文件名并且可以读取,则inspect模块将读取该文件,然后搜索class ClassName:行,并从该点开始为所有行提供相同或更深的缩进。交互式解释器执行__main__模块中的所有内容,并且解释器没有__file__属性,因此任何为其中定义的对象加载源代码的尝试都将失败。

如果您只想知道类定义的成员,请在对象上使用dir()help()。您无需查看该信息的完整源代码。