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

Python类继承中self变量与abstractmethod触发NameError问题咨询

报错原因解答

核心问题和继承、抽象类声明无关,是你把用到self的代码放错了作用域:self 是Python类实例方法的专属默认参数,只有在实例方法内部才能正常调用。

第一段代码正常运行的逻辑

第一段的打印语句被包裹在Employee的say_id实例方法内:

class Employee(AbstractEmployee):
    def say_id(self):
      print('Sim, o ID dele é {}'.format(self.id))

调用e1.say_id()时,Python会自动把实例对象e1作为self参数传入方法内部,此时self有明确的指向,继承自父类的self.id属性自然可以正常读取。

后两段代码报错的共同原因

你注释掉了say_id方法的定义行,把打印语句直接写到了Employee类的顶层作用域:

class Employee(AbstractEmployee):
    # def say_id(self): 该行被注释后,下方的print不属于任何实例方法
    print('Sim, o ID dele é {}'.format(self.id))

类顶层的代码会在类定义阶段直接执行,此时还没有创建任何类的实例,上下文里根本没有self这个变量,自然会触发NameError: name 'self' is not defined。
第三段移除了abstractmethod相关定义还是报错,也验证了这个问题和抽象类、继承逻辑完全无关,哪怕你写最简单的类,只要在类顶层直接调用self都会触发相同报错:

# 最简单的复现代码,运行直接报self未定义
class Test:
    print(self.xxx)

内容的提问来源于stack exchange,提问作者João Vitor Gomes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 21:54:03