Python派生类无法在类定义阶段引用继承属性的原因咨询
Python派生类无法在类定义阶段引用继承属性的原因咨询
我来帮你把这个问题掰扯明白哈~你写的这段代码确实会触发NameError: name 'foo' is not defined的错误,先把你的代码贴出来方便对照:
class A(object): def foo(): pass class B(A): bar = foo()
你肯定会纳闷:既然B继承了A,foo是A里的方法,为啥在B的类顶级定义里用不了?这其实是Python类定义机制的特性导致的:
类定义阶段的命名空间是独立的,不会触发继承属性查找。当Python执行到class B(A):下面的bar = foo()时,它正处在B类的定义过程中——这时候B还没完成继承绑定,父类A的属性还没被合并到B的命名空间里。这个阶段Python只会在当前B的局部命名空间、全局命名空间里找foo,完全不会去父类里搜,所以自然找不到,直接报错。
你提到在__init__方法里能正常用foo,这是因为__init__是在类实例化的时候才执行的,那时候B已经完全定义好了,继承关系也已经生效。这时候不管是通过self.foo()(实例属性查找)还是B.foo()(类属性查找),Python都会按照继承链去父类里找对应的属性,所以就能正常工作啦。
如果就想在B的类顶级定义里调用父类的foo,可以试试这两个办法:
- 直接通过父类
A显式调用:bar = A.foo(),这种方式最直观,直接跳过继承查找,指定从A里拿foo - 要是涉及多继承或者不想硬编码父类名,可以用
super(),写法是bar = super(B, B).foo(),不过这种写法在类定义阶段用得不多,适合复杂的继承场景
备注:内容来源于stack exchange,提问作者DrownedSuccess
相关产品推荐
相关产品推荐

