为何__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
相关产品推荐
相关产品推荐

