Python如何在一行打印对象所有属性?print obj无法输出全部属性
在Python一行内打印对象的所有属性
嘿,这个问题我太懂了!直接用print(obj)确实只能输出对象的默认字符串表示——要么是模糊的类名加内存地址,要么是类自定义的__str__返回值,根本看不到对象的全部属性细节。下面给你几个实用的一行实现方案,按需选就行:
方案1:通用型(适用于所有对象)
用dir()遍历所有属性名,结合getattr()获取对应值,再用字典推导式打包后打印:
print({attr: getattr(obj, attr) for attr in dir(obj) if not attr.startswith('__')})
- 解释:
dir(obj)会列出对象的所有属性、方法名;if not attr.startswith('__')是过滤掉双下划线开头的魔法属性(比如__init__、__dict__),如果想连魔法属性一起看,去掉这个条件就行。 - 进阶:如果只想看数据属性(排除方法这类可调用对象),可以再加个过滤条件:
print({attr: getattr(obj, attr) for attr in dir(obj) if not attr.startswith('__') and not callable(getattr(obj, attr))})
方案2:简洁型(适用于带__dict__的对象)
如果是自定义类的实例,或者有__dict__属性的对象,直接用vars()函数一步到位:
print(vars(obj))
- 解释:
vars(obj)直接返回对象的__dict__字典,里面存着实例的所有自定义属性,代码超级简洁。但要注意,像list、str这类内置类型没有__dict__,这个方法就不适用。
方案3:格式化输出型(属性太多时更清晰)
如果对象属性很多,普通打印会挤成一团,用pprint模块格式化输出,一行搞定导入加调用:
from pprint import pprint; pprint({attr: getattr(obj, attr) for attr in dir(obj) if not attr.startswith('__')})
或者结合vars()(适用时):
from pprint import pprint; pprint(vars(obj))
- 解释:
pprint会自动把字典格式化成换行缩进的结构,可读性强很多。
举个实际例子验证下:
class Person: def __init__(self, name, age): self.name = name self.age = age def say_hi(self): print(f"Hi, I'm {self.name}") p = Person("Alice", 25)
用方案1打印会得到:{'age': 25, 'name': 'Alice', 'say_hi': <bound method Person.say_hi of <__main__.Person object at 0x10a2b3d30>>},去掉方法过滤后就只剩数据属性了。
内容的提问来源于stack exchange,提问作者Blurry Script
相关产品推荐
相关产品推荐

