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

 更新时间:2025年06月17日 11:18:23   作者:1010n111  
在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提供一个内置函数来实现这一功能,不过,Python提供了一些工具和方法,可以组合使用来达到打印对象属性和值的目的,下面小编给大家讲讲

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

实现步骤

1. 使用vars()和pprint()

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

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()函数根据属性名获取属性值。

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. 自定义函数过滤属性

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

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)

核心代码

综合方法示例

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()。
  • 过滤不必要的属性:在打印属性时,过滤掉一些不需要的属性,如私有属性和方法,使输出更简洁。
  • 使用第三方库:如果需要更复杂的功能,如递归打印嵌套对象,可以考虑使用第三方库,如jsonpickle、ppretty等。

常见问题

1. vars()函数报错

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

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

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

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

3. 递归打印问题

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

以上就是Python打印对象所有属性和值的方法小结的详细内容,更多关于Python打印对象所有属性和值的资料请关注脚本之家其它相关文章!

相关文章

  • Python中的元类编程入门指引

    Python中的元类编程入门指引

    这篇文章主要介绍了Python中的元类编程入门指引,来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • Python发送网络请求(requests)

    Python发送网络请求(requests)

    这篇文章主要介绍了Python发送网络请求(requests),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python实现蒙特卡洛算法小实验过程详解

    Python实现蒙特卡洛算法小实验过程详解

    这篇文章主要介绍了Python实现基于蒙特卡洛算法过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 解读dataframe中有关inf的处理技巧

    解读dataframe中有关inf的处理技巧

    这篇文章主要介绍了解读dataframe中有关inf的处理技巧,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 使用Pycharm(Python工具)新建项目及创建Python文件的教程

    使用Pycharm(Python工具)新建项目及创建Python文件的教程

    这篇文章主要介绍了使用Pycharm(Python工具)新建项目及创建Python文件的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • python基础教程之csv格式文件的写入与读取

    python基础教程之csv格式文件的写入与读取

    逗号分隔值(Comma-Separated Values,CSV,也称为字符分隔值,分隔字符也可以不是逗号),新这篇文章主要给大家介绍了关于python基础教程之csv格式文件的写入与读取的相关资料,需要的朋友可以参考下
    2022-03-03
  • 如何使用Python连接 SSH 服务器并执行命令

    如何使用Python连接 SSH 服务器并执行命令

    实际开发中,有时候经常需要查看日志,有时候使用ssh工具打开就为了看一下错误日志又比较麻烦,所以今天带来一个简单的基于python的小工具,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • Django中模型Model添加JSON类型字段的方法

    Django中模型Model添加JSON类型字段的方法

    这篇文章主要介绍了Django中模型Model添加JSON类型字段的方法,实例分析了Python的Django框架模型使用技巧,需要的朋友可以参考下
    2015-06-06
  • Python3使用PySynth制作音乐的方法

    Python3使用PySynth制作音乐的方法

    这篇文章主要介绍了Python3使用PySynth制作音乐的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上

    PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上

    这篇文章主要介绍了PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上的相关知识,本文通过代码加文字说明的形式给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-04-04

最新评论