首页 新闻 会员 周边

__getattribute__ 是“执行机制”(方法/引擎):它是一套“如何查找属性”的算法规则

0
[已关闭问题] 关闭于 2026-07-15 17:30

因为 Person 类没有自己写这套规则,所以它继承了老祖宗 object 提供的默认规则

class Person:

    skin = "yellow"

    def init(self,name,age):

          self.name = name

          self.age = age

那skin属性是通过对象访问object的__getattribute__的skin吗

  • skin 是“数据存储”(属性/数据):它是实实在在的数据。它被定义在 Person 类中,所以它存放在 Person 类的字典(Person.__dict__)里。
*Tesla*的主页 *Tesla* | 老鸟四级 | 园豆:2040
提问于:2026-07-15 17:27
< >
分享
所有回答(1)
0

在这里,“引擎”是一个比喻。它具体指的是 __getattribute__ 这个魔术方法本身,以及它背后 Python 解释器(通常是 CPython)的底层 C 语言代码。

 Python 代码层面:引擎 = __getattribute__ 方法

在 Python 语言的规则里,这个“引擎”就是 __getattribute__ 方法。

  • 它就像一台设定好程序的机器。
  • 它的“程序逻辑”是固定的:先查实例的 __dict__,再查类的 __dict__,再查父类的 __dict__,最后找不到就报错。
  • 当你写 p.skin 时,就是启动了这台名为 __getattribute__ 的机器,让它按照既定程序去帮你找数据

为什么我要用“引擎”这个词来比喻?

因为 点号 .(属性访问运算符) 本身只是一个“语法符号”,它就像汽车的“油门踏板”。 而 __getattribute__(及其底层的 C 函数) 才是真正提供动力、执行复杂查找逻辑的“发动机(引擎)”。

当你踩下油门(输入 p.skin),引擎(__getattribute__)就开始轰鸣运转,按照特定的机械顺序(查实例 -> 查类 -> 查父类)去完成任务。

当你执行 p.skin 时,Python 底层真实发生的事情如下:

  • 第 1 步:启动引擎 Python 发现你要访问 pskin,于是调用 object.__getattribute__(p, 'skin')。(因为 Person 没重写,所以用 object 的)。
  • 第 2 步:查实例字典 这个引擎先去 p 自己的口袋(p.__dict__)里找 skin。发现只有 nameage,没找到 skin
  • 第 3 步:查类字典(关键!) 引擎顺藤摸瓜,去 p 所属的类(Person.__dict__)里找。在 Person 的字典里发现了 'skin': 'yellow',于是把 'yellow' 返回给你。

(注:如果 Person 类里也没有 skin,引擎才会继续往上去 object.__dict__ 里找,但 object 里显然没有 skin,最后就会报错 AttributeError。)

*Tesla* | 园豆:2040 (老鸟四级) | 2026-07-15 17:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册