首页 新闻 会员 周边

类不属于LEGB作用域吗,LEGB不适用面向对象,是面向过程的作用域

0
[已关闭问题] 关闭于 2026-07-17 18:01

LEGB 不是“面向过程的作用域”,而是“词法作用域(Lexical Scope)”;而面向对象使用的不是作用域,而是“属性查找机制(Attribute Resolution)”。

一、 核心对比:词法作用域 (LEGB) vs 面向对象查找 (MRO)

你可以把 Python 看作一个拥有“两套户籍系统”的国家:

1. LEGB:认“代码位置”(静态的词法作用域)

  • 别名:静态作用域。
  • 核心逻辑“你出生在哪里,你的老家就在哪里。”
  • 工作方式:它只看代码的文本嵌套结构。函数 inner 写在函数 outer 里面,outer 就是它的老家。不管这个函数将来被传递到哪里执行,它找变量永远只回“代码里的老家”找。
  • 适用场景:普通函数、闭包、全局变量。

2. OOP 属性查找:认“对象血缘”(动态的对象图查找)

  • 别名:动态绑定、消息传递。
  • 核心逻辑“你现在的身份是什么,就顺着你现在的家族树去找。”
  • 工作方式:它只看运行时的对象实例。当调用 self.x 时,Python 根本不关心这行代码写在哪个文件、哪个类里,它只关心运行时 self 到底是个什么类型的对象,然后顺着这个对象的继承链(MRO)去一层层找。
  • 适用场景:类属性、实例属性、方法重写(多态)

如果面向对象(OOP)也使用 LEGB(词法作用域)来查找属性,面向对象最核心的灵魂——“多态(Polymorphism)”将彻底灰飞烟灭!

灾难发生:如果 speak 里的 sound 走 LEGB 作用域

  1. speak 方法在代码文本上,是定义在 Animal 类里面的。
  2. 按照 LEGB(词法作用域)的规则,speak 的“老家”是 Animal 的代码块。
  3. 因此,当 dog.speak() 执行时,它去老家找 sound永远只会找到 Animal.sound(打印 "...")
  4. 结果:狗不会叫,猫也不会叫,所有的子类重写(Override)全部失效!多态被彻底摧毁。

拯救世界:使用 OOP 属性查找(self.sound

  1. 我们强制写成 print(self.sound)
  2. 运行时,self 是一个 Dog 实例。
  3. Python 触发属性查找机制,去 Dog__dict__ 里找,找到了 "汪汪汪"
  4. 结果:完美实现多态!

结论:LEGB 是“死”的(绑定在代码文本上),而 OOP 必须是“活”的(绑定在运行时的对象上)。

*Tesla*的主页 *Tesla* | 老鸟四级 | 园豆:2024
提问于:2026-07-17 16:05
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册