Python嵌套类继承报错:内部类D继承B时提示NameError未定义
Python嵌套类跨层级继承报错解决方案
报错原因
Python的类作用域不会被纳入嵌套作用域的查找链(即常规LEGB规则不包含外层类作用域):
- 定义类A的直接内部类C时,当前作用域处于A的类定义内部,可直接访问到同属A作用域的B类,因此C继承B不会报错
- 定义C的内部类D时,当前作用域处于C的类定义内部,此时向上查找名字只会遍历模块全局作用域,不会自动回溯外层的A类作用域,因此找不到B的定义,触发NameError
解决方法
两种常用修复方案:
方案1:明确指定B类的全路径
直接使用A.B指代目标父类,修改对应代码行即可:
class A: ''' merge all services together ''' def __init__(self): self.event = 'event' '''It includes all common method to all services''' # TODO inherit these class in others class B: def __init__(self): self.event = 'event' def get_event_type(self): self.event = 'event' class C(B): def __init__(self): self.event = 'event' # 明确指定父类全路径 class D(A.B): def __init__(self): self.event = 'event' def get_job_id(self): self.event = 'event'
方案2:在C类内部提前绑定B的引用
如果不想重复写全路径,可以在C类作用域内先给B做别名绑定:
class A: ''' merge all services together ''' def __init__(self): self.event = 'event' '''It includes all common method to all services''' # TODO inherit these class in others class B: def __init__(self): self.event = 'event' def get_event_type(self): self.event = 'event' class C(B): # 提前绑定B的引用,当前作用域在A内部,可以直接访问到B B = B def __init__(self): self.event = 'event' # 此时D可以直接访问C作用域下的B别名 class D(B): def __init__(self): self.event = 'event' def get_job_id(self): self.event = 'event'
内容的提问来源于stack exchange,提问作者Developer Satish
相关产品推荐
相关产品推荐

