code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>和<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>;<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>返回对象所有可访问的属性和方法(包括继承和特殊方法),适用于探索对象的完整接口;而<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>仅包含实例自身的数据属性,不包含方法和类属性,适合查看实例状态。两者区别在于:<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>提供全面的成员列表,<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>则聚焦实例的命名空间。若需过滤特殊属性或区分数据与方法,可结合<code class='language-default'><code class='language-default'><code class='language-default'>getattr()code>code>code>和<code class='language-default'>callable()code>进行判断;在继承场景中,<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>遵循MRO包含基类成员,<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>仅显示实例自身属性。实际应用中,根据需求选择合适方法:<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>用于概览,<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>用于序列化或调试实例数据。c="https://img.php.
cn/upload/article/001/431/639/175773450369087.png" alt="python中怎么获取一个对象的所有属性?">
在Python中,要获取一个对象的所有属性,最常用的方法是使用内置函数
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
或直接访问对象的
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
属性。这两者各有侧重,
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
更偏向于探索对象所有可访问的成员,包括方法和继承的属性,而
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
则主要关注实例自身的、非方法的数据属性。具体用哪个,得看你“所有属性”的定义是什么。
解决方案
当我们谈论获取Python对象的所有属性时,通常是在尝试理解一个对象能做什么,或者它内部存储了什么数据。这里有几种核心的策略,每种都有其适用场景和需要注意的地方。
首先,最直观且全面的工具是内置的
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
函数。当你对一个对象调用
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
时,它会返回一个包含该对象所有有效属性(包括方法、数据属性以及从其类和基类继承的属性)名称的列表。这对于快速概览一个对象的能力非常有用。例如:
<codeclass='language-default'>class MyClass: <codeclass='language-default'>class_attrcode> = "I'm aclass attribute" def <codeclass='language-default'><codeclass='language-default'>__init__code>code>(self,name, value): self.name=nameself.value = value def greet(self): return f"Hello, {self.name}!" obj = MyClass("Alice", 100) print(<codeclass='language-default'>dir(obj)code>) # 结果会包含 'name', 'value', 'greet', '<codeclass='language-default'>class_attrcode>' 以及大量内置的特殊方法(如<codeclass='language-default'><codeclass='language-default'>__init__code>code>, <codeclass='language-default'><codeclass='language-default'>__str__code>code>等)code>
然而,如果你只对对象实例自身定义的那些数据属性感兴趣,而不是那些方法或者从类、父类继承下来的东西,那么访问对象的
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
属性会更直接。
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
是一个字典,存储了实例的命名空间,键是属性名,值是属性值。并非所有对象都有
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
(例如,某些内置类型就没有),但对于我们自己定义的类实例,它通常是可用的。
print(obj.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>) # 结果通常是 {'name': 'Alice', 'value': 100} # 注意:<codeclass='language-default'>class_attrcode> 和 greet 方法不会出现在这里,因为它们是类属性/方法,而不是实例属性。
还有一个相关的内置函数
<codeclass='language-default'>vars()code>
,它在没有参数时返回当前作用域的
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
,当传入一个对象时,如果该对象有
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
属性,
<codeclass='language-default'><codeclass='language-default'>vars(obj)code>code>
会返回
obj.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
。所以,
<codeclass='language-default'><codeclass='language-default'>vars(obj)code>code>
基本上是
obj.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
的一个便捷别名,但它在处理没有
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
的对象时会抛出
<codeclass='language-default'>TypeErrorcode>
。
print(<codeclass='language-default'><codeclass='language-default'>vars(obj)code>code>) # 结果同 obj.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>: {'name': 'Alice', 'value': 100}
在实际开发中,我发现
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
适合探索未知对象,而
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
更适合在需要序列化对象状态或进行运行时修改实例数据时使用。
Python中<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>和dict有什么区别?
dir()这个问题问得好,这是理解Python对象模型时一个非常核心的知识点。我个人在初学Python时也曾为此困惑,因为它们看起来都像是在列举属性,但结果却大相径庭。
最根本的区别在于它们的目的和范围。
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
函数的设计初衷是提供一个“目录”或“索引”,列出对象所有可访问的成员。这意味着它不仅会包含对象实例自己定义的属性(比如
<codeclass='language-default'>obj.namecode>
),还会包括:
- 方法: 无论是实例方法、类方法还是静态方法,只要能通过对象访问,
<
codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>都会列出。
- 继承的属性和方法: 对象从其类以及所有父类继承的属性和方法,
<
codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>也会一并呈现。
- 特殊方法(dunder methods): 那些以双下划线开头和结尾的特殊方法,如
<
codeclass='language-default'><codeclass='language-default'>__init__code>code>,
<
codeclass='language-default'><codeclass='language-default'>__str__code>code>,
<
codeclass='language-default'><codeclass='language-default'>__add__code>code>等,它们定义了对象的行为,
<
codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>也会显示。
所以,
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
给我们的是一个综合性的视图,告诉你这个对象“能做什么”和“拥有什么公共接口”。它背后的机制比较复杂,涉及到对象的
<codeclass='language-default'>__dir__code>
方法、类的
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
和父类的
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
等。
而
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
属性则是一个字典,它仅仅存储了对象实例自身的、非方法的数据属性。也就是说:
- 仅限实例属性: 只有那些直接通过
<
codeclass='language-default'>self.attribute = valuecode>形式在实例上创建或修改的属性才会出现在
<
codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>中。
- 不包含方法: 方法是存储在类定义中的,而不是每个实例的
<
codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>里。
- 不包含类属性: 如果类定义了一个
<
codeclass='language-default'>class_attrcode>,除非你在实例上显式地给
obj.<
codeclass='language-default'>class_attrcode>赋值(这会创建一个同名的实例属性并“遮蔽”类属性),否则它也不会出现在
<
codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>中。
- 不包含继承的属性: 除非这些继承的属性在实例上被重新赋值。
举个例子可能更清晰:
class <codeclass='language-default'>Parentcode>: <codeclass='language-default'>parent_attrcode> = "From <codeclass='language-default'>Parentcode>" def <codeclass='language-default'>parent_methodcode>(self): passclass <codeclass='language-default'>Childcode>(<codeclass='language-default'>Parentcode>): <codeclass='language-default'>child_attrcode> = "From <codeclass='language-default'>Childcode>" def <codeclass='language-default'><codeclass='language-default'>__init__code>code>(self, <codeclass='language-default'><codeclass='language-default'>instance_attrcode>code>): self.<codeclass='language-default'><codeclass='language-default'>instance_attrcode>code> = <codeclass='language-default'><codeclass='language-default'>instance_attrcode>code> def <codeclass='language-default'>child_methodcode>(self): passc= <codeclass='language-default'>Childcode>("hello") print("<codeclass='language-default'><codeclass='language-default'>dir(c)code>code> 结果示例 (部分):") for attr in <codeclass='language-default'><codeclass='language-default'>dir(c)code>code>: if not attr.startswith('__'): # 过滤掉特殊方法,让结果更清晰 print(attr) # 可能会输出:<codeclass='language-default'>child_attrcode>, <codeclass='language-default'><codeclass='language-default'>instance_attrcode>code>, <codeclass='language-default'>parent_attrcode>, <codeclass='language-default'>child_methodcode>, <codeclass='language-default'>parent_methodcode> 等 print("nc.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code> 结果:") print(c.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>) # 输出: {'<codeclass='language-default'><codeclass='language-default'>instance_attrcode>code>': 'hello'}
从这个例子可以看出,
<codeclass='language-default'><codeclass='language-default'>dir(c)code>code>
包含了
<codeclass='language-default'>child_attrcode>
(类属性)、
<codeclass='language-default'>parent_attrcode>
(继承的类属性)、
<codeclass='language-default'>child_methodcode>
(实例方法) 和
<codeclass='language-default'>parent_methodcode>
(继承的方法),以及
<codeclass='language-default'><codeclass='language-default'>instance_attrcode>code>
(实例属性)。而
c.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
则只有
<codeclass='language-default'><codeclass='language-default'>instance_attrcode>code>
。这就像
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
是一个图书馆的总目录,列出了所有书籍和房间;而
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
只是你个人书桌上放的书,仅此而已。
如何只获取对象的用户自定义属性,排除内置方法和特殊属性?
在很多实际场景中,我们可能并不想看到
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
返回的那些冗长的内置特殊方法(比如
<codeclass='language-default'><codeclass='language-default'>__init__code>code>
,
<codeclass='language-default'><codeclass='language-default'>__str__code>code>
,
<codeclass='language-default'><codeclass='language-default'>__add__code>code>
等),或者那些仅仅是方法而不是数据属性的成员。我们更关心的是那些我们自己定义在类或实例上的“有意义”的属性。要实现这一点,我们需要对
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
的结果进行一些过滤,或者结合
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
和
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>getattr()code>code>code>
进行判断。
方法一:过滤
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
的结果
这是最直接也最常用的方式。通常,用户自定义的属性和方法不会以双下划线开头和结尾(
<codeclass='language-default'>__attr__code>
形式)。所以,我们可以遍历
<codeclass='language-default'>dir(obj)code>
的结果,并排除掉那些符合“dunder”命名模式的项。
com/ai/skyreels">cn/upload/ai_manual/000/000/000/175680080211654.png" alt="python中怎么获取一个对象的所有属性?">
com/ai/skyreels">SkyReels
SkyReels是全球首个融合3D引擎与生成式AI的AI视频创作平台
cxw.com/static/images/card_xiazai.png" alt="python中怎么获取一个对象的所有属性?">865 class MyObject: <codeclass='language-default'>class_datacode> = 10 def <codeclass='language-default'><codeclass='language-default'>__init__code>code>(self,name): self.name=nameself.age = 30 def say_hello(self): return f"Hello, {self.name}" obj = MyObject("Bob") user_defined_attrs = [] for attr_namein <codeclass='language-default'>dir(obj)code>: if not attr_name.startswith('__') and not attr_name.endswith('__'): user_defined_attrs.append(attr_name) print("用户自定义属性 (不含dunder):", user_defined_attrs) # 结果可能类似:['age', '<codeclass='language-default'>class_datacode>', 'name', 'say_hello']
这个列表里依然会包含方法,如果你只想获取数据属性,还需要进一步判断。
方法二:结合
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>getattr()code>code>code>
判断是否可调用
如果你想进一步区分数据属性和方法,可以使用
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>getattr()code>code>code>
获取属性本身,然后用
<codeclass='language-default'>callable()code>
函数来判断它是否是一个可调用的对象(即方法)。
class MyObject: <codeclass='language-default'>class_datacode> = 10 def <codeclass='language-default'><codeclass='language-default'>__init__code>code>(self,name): self.name=nameself.age = 30 def say_hello(self): return f"Hello, {self.name}" obj = MyObject("Bob") data_attrs = [] methods = [] for attr_namein <codeclass='language-default'>dir(obj)code>: if not attr_name.startswith('__') and not attr_name.endswith('__'): attr_value = getattr(obj, attr_name) ifcallable(attr_value): methods.append(attr_name) else: data_attrs.append(attr_name) print("用户自定义数据属性:", data_attrs) # 结果可能类似:['age', '<codeclass='language-default'>class_datacode>', 'name'] print("用户自定义方法:", methods) # 结果可能类似:['say_hello']
这种方法相对健壮,能清晰地将数据和行为分开。
方法三:利用
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
(主要用于实例数据)
如果你只关心实例上直接定义的数据属性,
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
是最直接的选择。它天然地排除了类属性、继承属性和方法。
class MyObject: <codeclass='language-default'>class_datacode> = 10 def <codeclass='language-default'><codeclass='language-default'>__init__code>code>(self,name): self.name=nameself.age = 30 def say_hello(self): return f"Hello, {self.name}" obj = MyObject("Bob") instance_data_attrs = obj.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>.keys() print("实例数据属性:", list(instance_data_attrs)) # 结果:['name', 'age']
请注意,这种方法不会包含
<codeclass='language-default'>class_datacode>
,因为它是一个类属性。如果你需要同时获取类属性和实例属性,那么方法二会更合适。选择哪种方法,完全取决于你对“用户自定义属性”的具体定义和需求。我个人在做对象序列化或者调试时,经常会用
obj.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
来快速查看实例的内部状态。
在继承和多态场景下,如何正确获取对象的属性?
继承和多态是面向对象编程的核心,它们使得代码更具复用性和灵活性。但在这种复杂的关系中,理解对象属性的来源和查找顺序变得尤为重要。正确获取属性,意味着你需要知道一个属性是来自实例本身、它的类、还是它的某个父类。
首先,
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
在继承场景下表现得非常“智能”。当你对一个子类实例调用
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
时,它会按照Python的方法解析顺序(Method Resolution Order, MRO)来查找所有可访问的属性和方法。这意味着它会自然地包含从所有基类继承下来的公共成员。
class <codeclass='language-default'>Grandparentcode>:grand_attr= "Grand" def grand_method(self): passclass <codeclass='language-default'>Parentcode>(<codeclass='language-default'>Grandparentcode>): <codeclass='language-default'>parent_attrcode> = "<codeclass='language-default'>Parentcode>" def <codeclass='language-default'>parent_methodcode>(self): passclass <codeclass='language-default'>Childcode>(<codeclass='language-default'>Parentcode>): <codeclass='language-default'>child_attrcode> = "<codeclass='language-default'>Childcode>" def <codeclass='language-default'><codeclass='language-default'>__init__code>code>(self,name): self.name=namedef <codeclass='language-default'>child_methodcode>(self): passc= <codeclass='language-default'>Childcode>("Charlie") print("<codeclass='language-default'><codeclass='language-default'>dir(c)code>code> 在继承场景下的结果 (部分):") for attr in <codeclass='language-default'><codeclass='language-default'>dir(c)code>code>: if not attr.startswith('__') and not attr.endswith('__'): print(attr) # 输出会包含:<codeclass='language-default'>child_attrcode>, <codeclass='language-default'>parent_attrcode>,grand_attr,name, <codeclass='language-default'>child_methodcode>, <codeclass='language-default'>parent_methodcode>, grand_method
可以看到,
<codeclass='language-default'><codeclass='language-default'>dir(c)code>code>
自动收集了
<codeclass='language-default'>Grandparentcode>
、
<codeclass='language-default'>Parentcode>
和
<codeclass='language-default'>Childcode>
类以及实例
c
上的所有非特殊属性。这对于快速了解一个复杂继承体系下对象的全貌非常方便。
然而,
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
在继承场景下则显得“保守”得多。它只会显示那些直接在当前实例上设置的属性。这意味着,从父类继承的类属性或方法,如果没有在子类实例上被显式地重新赋值,就不会出现在子类实例的
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
中。
print("nc.<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code> 在继承场景下的结果:") print(c.<code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'><code class='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>) # 输出: {'name': 'Charlie'}
这里的
c.<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
只包含了
name
,因为它是
<codeclass='language-default'>Childcode>
类的
<codeclass='language-default'><codeclass='language-default'>__init__code>code>
方法中通过
self.name
设置的实例属性。
<codeclass='language-default'>child_attrcode>
、
<codeclass='language-default'>parent_attrcode>
、
grand_attr
等类属性以及所有方法都不会出现,因为它们是类级别的,不是实例级别的。
如果你需要明确知道一个属性是来自实例、类还是父类,或者想更细致地控制,
inspect
模块会提供更强大的内省能力,比如
inspect.getmembers()
。它允许你指定一个谓词(predicate)来过滤成员类型。
import inspectclass <codeclass='language-default'>Grandparentcode>:grand_attr= "Grand" def grand_method(self): passclass <codeclass='language-default'>Parentcode>(<codeclass='language-default'>Grandparentcode>): <codeclass='language-default'>parent_attrcode> = "<codeclass='language-default'>Parentcode>" def <codeclass='language-default'>parent_methodcode>(self): passclass <codeclass='language-default'>Childcode>(<codeclass='language-default'>Parentcode>): <codeclass='language-default'>child_attrcode> = "<codeclass='language-default'>Childcode>" def <codeclass='language-default'><codeclass='language-default'>__init__code>code>(self,name): self.name=namedef <codeclass='language-default'>child_methodcode>(self): passc= <codeclass='language-default'>Childcode>("David") print("n使用 inspect.getmembers 获取所有数据属性:") # inspect.isdatadescriptor 检查是否是数据描述符(包括普通属性) # inspect.ismethod 检查是否是方法 # inspect.isfunction 检查是否是函数 (对于类中的方法,它会是method) # 获取所有非特殊的数据属性 (包括类属性和实例属性) all_data_attrs = [nameforname, value in inspect.getmembers(c, lambda member: not inspect.ismethod(member) and not inspect.isfunction(member) and notname.startswith('__'))] print(all_data_attrs) # 结果可能类似:['<codeclass='language-default'>child_attrcode>', 'grand_attr', 'name', '<codeclass='language-default'>parent_attrcode>'] # 获取所有方法 all_methods = [nameforname, value in inspect.getmembers(c, inspect.ismethod)] print(all_methods) # 结果可能类似:['<codeclass='language-default'>child_methodcode>', 'grand_method', '<codeclass='language-default'>parent_methodcode>']
inspect.getmembers()
结合不同的谓词,能让你在继承和多态的复杂结构中,更精确地筛选出你想要的属性类型。它会遍历MRO,所以能看到所有可访问的成员。
理解
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
和
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
在继承链上的行为差异,对于调试、反射编程和元编程都至关重要。
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
给你一个高层次的“能见度”,而
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
则揭示了实例最核心的、独有的状态。
inspect
模块则提供了更精细的控制,让你能像外科医生一样,精确地解剖对象的内部结构。在实践中,我通常会先用
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>dir()code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
快速摸清对象的大致轮廓,然后根据需要深入到
<codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'><codeclass='language-default'>__dict__code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>code>
或
inspect
模块来获取更具体的信息。
ck="hits_log(2,'www',this);" href-data="/zt/15730.html" target="_blank">python click="hits_log(2,'www',this);" href-data="/zt/16186.html" target="_blank">app click="hits_log(2,'www',this);" href-data="/zt/16887.html" target="_blank">工具 click="hits_log(2,'www',this);" href-data="/zt/24154.html" target="_blank">面向对象编程 click="hits_log(2,'www',this);" href-data="/zt/27988.html" target="_blank">区别 click="hits_log(2,'www',this);" href-data="/zt/35787.html" target="_blank">作用域 click="hits_log(2,'www',this);" href-data="/zt/122037.html" target="_blank">red click="hits_log(2,'www',this);" href-data="/search?word=Python" target="_blank">Python click="hits_log(2,'www',this);" href-data="/search?word=命名空间" target="_blank">命名空间 click="hits_log(2,'www',this);" href-data="/search?word=面向对象" target="_blank">面向对象 click="hits_log(2,'www',this);" href-data="/search?word=多态" target="_blank">多态 click="hits_log(2,'www',this);" href-data="/search?word=父类" target="_blank">父类 click="hits_log(2,'www',this);" href-data="/search?word=子类" target="_blank">子类 click="hits_log(2,'www',this);" href-data="/search?word=继承" target="_blank">继承 click="hits_log(2,'www',this);" href-data="/search?word=接口" target="_blank">接口 click="hits_log(2,'www',this);" href-data="/search?word=Attribute" target="_blank">Attribute click="hits_log(2,'www',this);" href-data="/search?word=对象" target="_blank">对象 click="hits_log(2,'www',this);" href-data="/search?word=作用域" target="_blank">作用域 大家都在看:
com/faq/1515642.html" title="从HDF5一维数组重构图像:Python数据处理与可视化指南">从HDF5一维数组重构图像:Python数据处理与可视化指南 cxw.com/faq/1515626.html" title="Python中动态变量名访问与最佳实践:globals()与字典的应用">Python中动态变量名访问与最佳实践:globals()与字典的应用 cxw.com/faq/1515617.html" title="Python中如何根据字符串动态获取变量值">Python中如何根据字符串动态获取变量值 cxw.com/faq/1515610.html" title="Python单元测试:正确模拟json模块以避免<code class='language-default'>TypeErrorcode>">Python单元测试:正确模拟json模块以避免<code class='language-default'>TypeErrorcode> cxw.com/faq/1515600.html" title="Python模块动态扩展:深入理解“猴子补丁”与IDE智能提示的局限性">Python模块动态扩展:深入理解“猴子补丁”与IDE智能提示的局限性 click="hits_log(2,'www',this);" href-data="/zt/15730.html" target="_blank">python click="hits_log(2,'www',this);" href-data="/zt/16186.html" target="_blank">app click="hits_log(2,'www',this);" href-data="/zt/16887.html" target="_blank">工具 click="hits_log(2,'www',this);" href-data="/zt/24154.html" target="_blank">面向对象编程 click="hits_log(2,'www',this);" href-data="/zt/27988.html" target="_blank">区别 click="hits_log(2,'www',this);" href-data="/zt/35787.html" target="_blank">作用域 click="hits_log(2,'www',this);" href-data="/zt/122037.html" target="_blank">red click="hits_log(2,'www',this);" href-data="/search?word=Python" target="_blank">Python click="hits_log(2,'www',this);" href-data="/search?word=命名空间" target="_blank">命名空间 click="hits_log(2,'www',this);" href-data="/search?word=面向对象" target="_blank">面向对象 click="hits_log(2,'www',this);" href-data="/search?word=多态" target="_blank">多态 click="hits_log(2,'www',this);" href-data="/search?word=父类" target="_blank">父类 click="hits_log(2,'www',this);" href-data="/search?word=子类" target="_blank">子类 click="hits_log(2,'www',this);" href-data="/search?word=继承" target="_blank">继承 click="hits_log(2,'www',this);" href-data="/search?word=接口" target="_blank">接口 click="hits_log(2,'www',this);" href-data="/search?word=Attribute" target="_blank">Attribute click="hits_log(2,'www',this);" href-data="/search?word=对象" target="_blank">对象 click="hits_log(2,'www',this);" href-data="/search?word=作用域" target="_blank">作用域