Python中打印对象所有属性和值的方法

Python中打印对象所有属性和值的方法

技术背景

在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值。然而,Python并没有像PHP的print_r那样直接提供一个内置函数来实现这一功能。不过,Python提供了一些工具和方法,可以组合使用来达到打印对象属性和值的目的。

实现步骤

1. 使用vars()pprint()

vars()函数返回对象的__dict__属性,pprint()可以对数据进行美观的打印。

1
2
3
4
5
6
7
8
9
from pprint import pprint

class MyClass:
def __init__(self):
self.name = 'John'
self.age = 30

obj = MyClass()
pprint(vars(obj))

2. 使用dir()getattr()

dir()函数返回对象的所有属性名,getattr()函数根据属性名获取属性值。

1
2
3
4
5
6
7
8
9
10
11
def dump(obj):
for attr in dir(obj):
print("obj.%s = %r" % (attr, getattr(obj, attr)))

class MyClass:
def __init__(self):
self.name = 'John'
self.age = 30

obj = MyClass()
dump(obj)

3. 自定义函数过滤属性

可以编写自定义函数,过滤掉一些不需要的属性,如私有属性和方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pprint import pprint
from inspect import getmembers
from types import FunctionType

def attributes(obj):
disallowed_names = {
name for name, value in getmembers(type(obj))
if isinstance(value, FunctionType)
}
return {
name: getattr(obj, name) for name in dir(obj)
if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)
}

def print_attributes(obj):
pprint(attributes(obj))

class MyClass:
def __init__(self):
self.name = 'John'
self.age = 30

def say_hello(self):
pass

obj = MyClass()
print_attributes(obj)

核心代码

综合方法示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from pprint import pprint
from inspect import getmembers
from types import FunctionType

class MyClass:
def __init__(self):
self.name = 'John'
self.age = 30

def say_hello(self):
pass

def attributes(obj):
disallowed_names = {
name for name, value in getmembers(type(obj))
if isinstance(value, FunctionType)
}
return {
name: getattr(obj, name) for name in dir(obj)
if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)
}

obj = MyClass()
pprint(attributes(obj))

最佳实践

  • 选择合适的方法:根据对象的类型和需求选择合适的方法。如果对象有__dict__属性,vars()pprint()组合是一个简单有效的方法;如果需要获取所有属性,包括没有__dict__属性的对象,可以使用dir()getattr()
  • 过滤不必要的属性:在打印属性时,过滤掉一些不需要的属性,如私有属性和方法,使输出更简洁。
  • 使用第三方库:如果需要更复杂的功能,如递归打印嵌套对象,可以考虑使用第三方库,如jsonpickleppretty等。

常见问题

1. vars()函数报错

vars()函数要求对象有__dict__属性,如果对象没有该属性,会抛出TypeError异常。例如,set对象就没有__dict__属性。

1
2
3
4
5
s = {1, 2, 3}
try:
pprint(vars(s))
except TypeError as e:
print(f"Error: {e}")

2. dir()函数返回过多属性

dir()函数会返回对象的所有属性,包括内置属性和方法,可能会导致输出过多不必要的信息。可以通过自定义函数过滤这些属性。

3. 递归打印问题

如果对象包含嵌套对象,直接打印可能无法显示嵌套对象的详细信息。可以使用递归函数或第三方库来实现递归打印。


Python中打印对象所有属性和值的方法
https://119291.xyz/posts/2025-04-21.python-print-object-properties-and-values/
作者
ww
发布于
2025年4月21日
许可协议