【问题标题】:NameError when using a subclass in Python在 Python 中使用子类时出现 NameError
【发布时间】:2020-11-09 12:39:39
【问题描述】:

我有两个 .py 文件,一个用于 main(main.py) 模块,另一个包含一个类及其子类 (sub.py)。在主文件中,我使用的类如下。

## (main.py)
# Import the superclass
from sub import Class1
# Import the subclass
from sub import Class2
# Assign the object (it gives an error as described below)
myVariable=Class2()

我在 sub.py 中写这两个类的地方

## (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):
        super().__init__(eigval, eigvec, explained)
        self.ppc=nugget
        self.vol=nugget
        self.corr=nugget
        self.cov=nugget

我得到的错误是

NameError: name 'eigval' is not defined

虽然我在子类中使用 super() 继承了变量 eigval。 为什么会这样??

【问题讨论】:

  • Class2.__init__ 中,变量eigval 未在该范围内的任何地方定义。有一个self.eigval,但它也不存在。此外,super().__init__ 会给你Class1.__init__,它需要一个参数,但你试图传递 3...我认为你的意思是 super().__init__(nugget)
  • >>我认为你的意思是 super().__init__(nugget) 是的,这就是我的意思。感谢您的评论。我理解了这个问题以及如何解决它:)

标签: python inheritance subclass superclass nameerror


【解决方案1】:

你不需要将nugget以外的任何东西传递给Class2

class Class2(Class1):
    def __init__(self, nugget=0):
        super().__init__(nugget)
        self.ppc=nugget
        self.vol=nugget
        self.corr=nugget
        self.cov=nugget

否则您是正确的,super().__init__ 将从 Class1 调用 __init__,因此您的 Class2 实例将具有 eigvaleigvecexplained 成员。

>>> c = Class2()
>>> c.eigval
0

【讨论】:

  • 感谢您的清晰解释!我得到了想法:)
猜你喜欢
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
相关资源
最近更新 更多