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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:36:03