Python子类使用时触发NameError错误,求原因分析
为什么调用
super()会出现NameError? 你遇到的这个NameError: name 'eigval' is not defined,核心原因和继承本身无关——你在子类Class2的构造函数里调用super().__init__时,传入了eigval、eigvec、explained这些完全没定义的变量。
先拆解问题:
看父类Class1的构造规则
你的父类Class1的__init__只接受一个可选参数nugget,然后把这个值赋值给实例的三个属性:
class Class1: def __init__(self, nugget=0): self.eigval=nugget self.eigvec=nugget self.explained=nugget
这里的self.eigval是实例属性,不是可以直接在子类构造函数里直接引用的变量名。
你写错的地方
而你在子类Class2里写的是:
super().__init__(eigval, eigvec, explained)
这里的eigval、eigvec、explained既不是Class2的局部变量,也不是全局变量,Python根本找不到它们,自然抛出NameError。
正确的写法
根据你的需求,有两种修正方式:
方式1:沿用父类的单参数规则
如果不需要给父类的三个属性分别传不同值,直接把nugget参数传给父类即可:
# 修改后的sub.py class Class1: def __init__(self, nugget=0): self.eigval=nugget self.eigvec=nugget self.explained=nugget class Class2(Class1): def __init__(self, nugget=0): # 正确传递父类需要的nugget参数 super().__init__(nugget) self.ppc=nugget self.vol=nugget self.corr=nugget self.cov=nugget
这样你创建Class2对象时,myVariable=Class2()就不会报错了。
方式2:自定义父类的属性值
如果想给父类的三个属性分别设置不同的值,需要先修改父类的__init__,让它接受三个独立参数:
# 进阶版sub.py class Class1: # 修改父类构造函数,接受三个可选参数 def __init__(self, eigval=0, eigvec=0, explained=0): self.eigval=eigval self.eigvec=eigvec self.explained=explained class Class2(Class1): def __init__(self, nugget=0, eigval=0, eigvec=0, explained=0): # 传递对应参数给父类 super().__init__(eigval, eigvec, explained) self.ppc=nugget self.vol=nugget self.corr=nugget self.cov=nugget
此时你可以按需创建对象:
# 示例:给父类属性传自定义值 myVariable = Class2(nugget=5, eigval=10, eigvec=20)
总结一下:调用父类构造函数时,必须严格匹配父类定义的参数列表,不能随便传父类没声明的参数名,也不能传未定义的变量。
内容的提问来源于stack exchange,提问作者yufiP
相关产品推荐
相关产品推荐

