You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何__class__可在Python实例方法中直接访问?

为什么实例方法中能直接用__class__但引用方法名会报错?

这个问题其实涉及到Python里变量解析的作用域规则和特殊类属性的内置行为,咱们一步步理清楚:

1. __class__是Python自动注入的特殊标识符

在Python的实例方法(比如你的__init__、foo)里,__class__是一个被Python解释器自动注入到方法局部作用域的特殊变量,它指向的就是定义这个方法的类(也就是Test类)。

不管你在哪个实例方法里使用它,Python都会帮你做好绑定,所以不需要你提前定义就能直接用——这也是为什么你运行t = Test()和t.foo()时,都能正常打印出<class '__main__.Test'>。

而super()等价于super(__class__, self)的说法,本质上也是利用了这个特性:__class__在实例方法的作用域里已经存在,所以可以直接拿来用。

2. 直接引用方法名bar会触发作用域查找失败

当你在bar方法里写print(bar)时,Python会按照LEGB作用域规则(局部作用域→闭包作用域→全局作用域→内置作用域)去查找名为bar的变量,但:

  • 局部作用域里没有定义bar这个变量;
  • 闭包/全局/内置作用域里也不存在名为bar的标识符;

所以自然会抛出NameError: name 'bar' is not defined。

如果想要在方法内部引用自身这个方法,你需要通过实例对象(也就是self)来访问,比如改成print(self.bar),这样Python就能通过实例的属性找到这个方法,输出类似<bound method Test.bar of <__main__.Test object at 0x...>>的结果。

内容的提问来源于stack exchange,提问作者buckle2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:03:07