我开始使用Python编写各种项目的代码(包括Django web开发和Panda3D游戏开发)。

为了帮助我理解发生了什么,我想基本上“看看”Python对象内部,看看它们是如何运行的——比如它们的方法和属性。

假设我有一个Python对象,我需要什么来打印它的内容?这可能吗?


当前回答

如果你有兴趣查看对象myobj对应的函数的源代码,你可以输入iPython或Jupyter Notebook:

myobj ? ?

其他回答

我很惊讶居然没人提到帮助!

In [1]: def foo():
   ...:     "foo!"
   ...:

In [2]: help(foo)
Help on function foo in module __main__:

foo()
    foo!

Help让您阅读文档字符串并了解类可能具有的属性,这非常有用。

如果您正在寻找一个稍微更微妙的解决方案,您可以尝试objprint。它的一个积极的方面是它可以处理嵌套对象。例如:

from objprint import objprint

class Position:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Player:
    def __init__(self):
        self.name = "Alice"
        self.age = 18
        self.items = ["axe", "armor"]
        self.coins = {"gold": 1, "silver": 33, "bronze": 57}
        self.position = Position(3, 5)

objprint(Player())

会打印出来

<Player
  .name = 'Alice',
  .age = 18,
  .items = ['axe', 'armor'],
  .coins = {'gold': 1, 'silver': 33, 'bronze': 57},
  .position = <Position
    .x = 3,
    .y = 5
  >
>

object.__dict__

虽然其他人已经提到了pprint,但我想添加一些上下文。

pprint模块提供了任意“漂亮打印”的功能 形式的Python数据结构,该形式可用作 翻译。如果格式化的结构包含的对象不是 基本的Python类型,表示可能是不可加载的。这 如果对象,如文件,套接字,类,或 实例包括在内,以及许多其他内置对象 不能表示为Python常量。

对于具有PHP背景、正在寻找var_dump()替代品的开发人员来说,pprint可能非常需要。

带有dict属性的对象可以使用pprint()和vars()混合转储,它会为模块、类、实例等返回__dict__属性:

from pprint import pprint
pprint(vars(your_object))

所以,不需要循环。

要转储包含在全局或局部作用域中的所有变量,只需使用:

pprint(globals())
pprint(locals())

Locals()显示函数中定义的变量。 在其他用法中,将函数的对应名称作为字符串键访问也很有用:

locals()['foo']() # foo()
globals()['foo']() # foo()

类似地,使用dir()查看模块的内容或对象的属性。

还有更多。

Python有一组强大的自省特性。

看看下面的内置函数:

(型) dir () (id) getattr () hasattr () globals () locals () callable ()

Type()和dir()分别对于检查对象的类型及其属性集特别有用。