python打印一个对象的所有属性

本文通过一个简单的Python类实例展示了如何定义类属性并打印这些属性。该类包含了三个字符串类型的属性,通过访问类实例的__dict__属性来展示所有已定义的属性。

如下↓

class Data(object):
    def __init__(self):
        self.value1 = 'caixukun'
        self.value2 = 'wuyifan'
        self.value3 = 'mabaoguo'


if __name__ == '__main__':
    
    # 随便声明一个类
    data = Data()
    
    # 打印它的全部属性
    print('\n'.join(['{0}: {1}'.format(item[0], item[1]) for item in data.__dict__.items()]))
    # value1: caixukun
	# value2: wuyifan
	# value3: mabaoguo
Python 中,如果你想打印一个对象的所有属性(包括其父类的属性),你可以使用以下几种方式来实现。每种方式适用于不同场景,下面详细说明。 --- ## ✅ 方法一:使用 `dir()` 函数(推荐) `dir()` 会列出对象的所有属性和方法(包括从父类继承来的)。 ```python class A: def __init__(self): self.a = 1 def method_a(self): pass class B(A): def __init__(self): super().__init__() self.b = 2 def method_b(self): pass b = B() print(dir(b)) ``` 输出结果类似: ```python ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'method_a', 'method_b'] ``` **优点:** - 简单、直接。 - 包含所有属性和方法,包括继承来的。 **缺点:** - 包含很多内置属性(如 `__dict__`、`__class__`),需要过滤。 --- ## ✅ 方法二:使用 `__dict__` 获取实例属性(仅当前类) `__dict__` 只包含当前实例定义的属性,不包括父类和方法。 ```python class A: def __init__(self): self.a = 1 class B(A): def __init__(self): super().__init__() self.b = 2 b = B() print(b.__dict__) ``` 输出: ```python {'a': 1, 'b': 2} ``` **优点:** - 仅显示实例变量,结构清晰。 **缺点:** - 不包括父类中定义的属性(如果父类没有在 `__init__` 中赋值给 `self`,则不会显示)。 - 不包括方法、类属性、继承来的属性。 --- ## ✅ 方法三:结合 `vars()` 和 `dir()` 获取所有属性 `vars()` 是 `__dict__` 的简化写法,但只适用于有 `__dict__` 属性对象。 ```python class A: def __init__(self): self.a = 1 class B(A): def __init__(self): super().__init__() self.b = 2 b = B() # 所有属性名(包括继承的) for attr in dir(b): if not attr.startswith('__'): print(f"{attr}: {getattr(b, attr)}") ``` 输出: ``` a: 1 b: 2 method_a: <bound method A.method_a of <__main__.B object at 0x...>> method_b: <bound method B.method_b of <__main__.B object at 0x...>> ``` **优点:** - 可以打印属性值。 - 可以包括继承来的属性和方法。 --- ## ✅ 方法四:使用 `inspect` 模块获取更详细的属性信息 ```python import inspect class A: def __init__(self): self.a = 1 class B(A): def __init__(self): super().__init__() self.b = 2 b = B() for name, value in inspect.getmembers(b): if not name.startswith('__'): print(f"{name}: {value}") ``` **优点:** - 可以获取属性和方法的详细信息。 - 更适合分析对象结构。 --- ## ✅ 方法五:获取所有类属性(包括父类的类属性) 如果你还希望获取类属性(非实例属性),可以使用如下方式: ```python class A: class_attr_a = "A" def __init__(self): self.a = 1 class B(A): class_attr_b = "B" def __init__(self): super().__init__() self.b = 2 b = B() # 获取所有类属性和实例属性 for cls in type(b).__mro__: print(f"From {cls.__name__}:") for k, v in vars(cls).items(): if not k.startswith('__'): print(f" {k} = {v}") # 实例属性 print("Instance attributes:") for k, v in b.__dict__.items(): print(f" {k} = {v}") ``` --- ## ✅ 小结对比 | 方法 | 是否包括父类属性 | 是否包括方法 | 是否包括类属性 | 是否推荐 | |------------------|------------------|----------------|------------------|------------| | `dir(obj)` | ✅ | ✅ | ❌ | ✅ 推荐 | | `obj.__dict__` | ❌ | ❌ | ❌ | ✅ 用于实例变量 | | `inspect.getmembers(obj)` | ✅ | ✅ | ❌ | ✅ 用于详细分析 | | 遍历 `__mro__` | ✅ | ✅ | ✅ | ✅ 用于深度分析 | ---
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么都干的派森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值