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

Written by

in

文章目录
  • 目录
    • Python中打印对象所有属性和值的方法
      • 实现步骤
        • 1. 使用vars()和pprint()
        • 2. 使用dir()和getattr()
        • 3. 自定义函数过滤属性
      • 核心代码
        • 综合方法示例
      • 最佳实践
      • 常见问题
        • 1. vars()函数报错
          • 2. dir()函数返回过多属性
            • 3. 递归打印问题

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

            from pprint import pprint
            
            class MyClass:
                def __init__(self):
                    self.name = 'John'
                    self.age = 30
            
            obj = MyClass()
            pprint(vars(obj))
            

            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)
            

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

            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等。

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

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

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

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

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

            您可能感兴趣的文章:

            • python 打印对象的所有属性值的方法
            • Python print函数:如何将对象打印输出
            • python 自定义对象的打印方法
            • python 打印出所有的对象/模块的属性(实例代码)

            站内搜索