当前位置: 首页 > 知识库问答 >
问题:

Python类继承:AttributeError:“[子类]”对象没有属性“xxx”

逑沛
2023-03-14

我有以下基类和子类:

class Event:
    def __init__(self, sr1=None, foobar=None):
        self.sr1 = sr1
        self.foobar = foobar
        self.state = STATE_NON_EVENT
 
# Event class wrappers to provide syntatic sugar
class TypeTwoEvent(Event):
    def __init__(self, level=None):
        self.sr1 = level
        self.state = STATE_EVENT_TWO

在我的代码中,我正在检查一个TypeTwoEvent类的实例,检查一个我知道存在于基类中的字段-我希望它默认为值。但是,我的代码引发了以下异常:

AttributeError:“TypeTwoEvent”对象没有属性“foobar”

我的印象是基类字段将被子类继承,创建子类的实例将实例化基类(从而调用其构造函数)...

我在这里错过了什么?为什么TypeTwoEvent没有fobar属性-当派生它的基类具有fobar属性时?

共有3个答案

窦国源
2023-03-14

创建实例时,调用其__init__方法。在这种情况下,即TypeTwoEvent.__init__。不会自动调用超类方法,因为这会非常混乱。

您应该调用事件__init\uuuu(自我,…) 来自”键入两个事件__init\uuuu(或使用super),但如果您不熟悉它,请先阅读它,以便知道您在做什么)。

慕容玉堂
2023-03-14

您正在覆盖父类的构造函数(__init__)。要扩展它,您需要使用Super()调用显式调用父类的构造函数。

class TypeTwoEvent(Event):
    def __init__(self, level=None, **kwargs):
        # the super call to set the attributes in the parent class
        super().__init__(**kwargs)
        # now, extend other attributes
        self.sr1 = level
        self.state = STATE_EVENT_TWO

请注意,super调用并不总是位于子类中的\uu init\uuu方法的顶部。它的位置取决于您的情况和逻辑。

姬墨竹
2023-03-14

您的子类应该是:

class TypeTwoEvent(Event):

    def __init__(self, level=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.sr1 = level
        self.state = STATE_EVENT_TWO

因为您重写了\uuu init\uuuu方法,所以如果希望发生父行为,则需要调用父方法。

请记住,___不是一个特殊的方法,尽管它的名字很奇怪。这只是创建对象后自动调用的方法。否则,这是一个普通方法,并应用普通继承规则。

super().__init__(arguments, that, goes, to, parents)

是调用方法的父版本的语法。

对于*args**kwargs,它只是确保我们捕获传递给\uu init\uu的所有附加参数,并将其传递给父方法,因为子方法签名没有这样做,父方法需要这些参数才能工作。

 类似资料:
  • 问题内容: 我有以下基类和子类: 在我的代码中,进一步,我正在检查一个类的实例,检查我知道在基类中存在的字段-我希望将其默认为value 。但是,我的代码引发以下异常: AttributeError:“ TypeTwoEvent”对象没有属性“ foobar” 我的印象是,基类字段将由子类继承,并且创建子类的实例将实例化基类(从而调用其构造函数)… 我在这里想念什么?为什么没有一个属性-当其所来源

  • 我一直在努力学习Python(目前的请求和美丽的soup4),我在网上找到了一个教程 问题是我一直得到下面的错误,根本无法弄清楚... 任何帮助都将不胜感激! 回溯(最近一次调用last):文件“C:\Users\BillyBob\Desktop\Web Scrap.py”,第14行,标题=a.string。strip()AttributeError:'NoneType'对象没有属性'strip'

  • 问题内容: 是否有理由要声明类声明object? 我刚刚找到了执行此操作的代码,但找不到很好的理由。 问题答案: 是否有理由要声明类声明object? 在Python 3中,除了Python 2和3之间的兼容性之外,没有任何理由。在Python 2中,原因很多。 Python 2.x故事: 在Python 2.x(从2.2开始)中,有两种类型的类,取决于是否存在object作为基类的类: “经典”

  • 我目前正在构建一个烧瓶应用程序 我能够从下面的stackoverflow留言板上得到这么远,但是我不认为我做对了什么(可能忽略了什么?) 在Flask应用中运行Dash应用 这里的任何帮助都将不胜感激 这是我的服务器。py代码: 这是我的服务器。py:从应用程序导入服务器,应用程序服务器。运行(调试=True) 当我运行这一切时,我得到:

  • 问题内容: 我正在使用python 3.3.3。我正在从tutorialspoint.com做本教程。我无法理解此错误是什么。 这是我的代码: 错误: 问题答案: 您在这里遇到问题有两个原因。第一个是您以只写模式创建的。您需要一个可以读写的文件对象。您还可以使用关键字在完成处理后自动销毁文件对象,而不必担心手动关闭它: 第二个是(就像您非常强烈地指出的错误一样)文件对象(文本文件对象)没有方法。您

  • 问题内容: 我收到一个错误 尝试写入文件时。它是关于编写有关学生分数,他们的姓名,姓氏,班级名称的文件(只需输入班级为),以记录有多少个分数及其分数。仅将其最近的3个分数保存在文件中。我不明白这是什么意思。 这是代码 问题答案: 您的附加代码混合在一起了。该方法在对象上: 请注意,我还将呼叫 移出 了循环。 您不需要在那里使用循环;如果要列出所有行,只需执行以下操作: 要处理文件关闭,请将文件对象