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

