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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:07:31