Q在 Python 里,attribute 和 method 有什么区别?我在看 Python 对象时经常看到 attribute 和 method,这两者看起来都挂在对象下面,它们到底有什么不同?

Aattribute 与 method 的核心区别

attribute 是对象身上保存的数据或状态,比如 name、age、dict 等;method 则是可调用的行为,本质上通常是绑定在对象或类上的函数。你可以把 attribute 理解为“对象有什么”,把 method 理解为“对象能做什么”。在实际使用中,访问 attribute 一般用点号直接取值,调用 method 则需要加括号。

QPython 对象里的属性为什么会有实例属性和类属性之分?我发现有些值写在类里,有些值写在对象里,它们都能用点号访问,这种区分有什么意义?

A实例属性和类属性的作用

实例属性属于某一个具体对象,通常只影响当前实例;类属性属于整个类,所有实例在默认情况下都能共享。这个设计能帮助你区分“个体差异”和“共同配置”。当某个值需要每个对象各自保存时,更适合放在实例属性里;当某个值需要所有对象共用时,更适合放在类属性里。

Q为什么有些 Python 属性前面会带下划线或双下划线?我经常看到 _name、__name__ 这类写法,这些算属性吗,它们分别代表什么含义?

A下划线属性的常见约定

这些都属于 Python 的属性写法,只是命名约定不同。单下划线开头通常表示“内部使用”或“不建议外部直接访问”;双下划线开头在类中可能触发名称改写,用来减少子类或外部意外覆盖的概率;双下划线前后都有的名字通常是 Python 的特殊属性或魔术属性,比如 init、dict、name。这些命名方式主要是为了表达用途和控制访问习惯。

Q我怎样判断一个对象到底有哪些可用属性?拿到一个陌生对象时,我想快速知道它支持哪些属性和方法,有没有比较方便的查看方式?

A查看对象属性的常用办法

你可以使用 dir(obj) 查看对象可访问的属性和方法列表,也可以查看 obj.dict 了解对象自身保存了哪些实例属性。若想判断某个属性是否存在,可以使用 hasattr(obj, 'attr');想安全获取属性值,可以使用 getattr(obj, 'attr', 默认值)。这些方式在调试和阅读第三方库代码时都很实用。