python - super().__init__() 中的“意外关键字参数”

标签 python python-3.x

我正在写一个小型文字游戏。 尝试定义类变量时,我不断收到错误消息。

这是类代码:

class Scenery():
    def __init__(self,name,description):
        self.name=name
        self.description=description

class Door(Scenery):
    def __init__(self,openstatus,lockstatus):
        self.openstatus=openstatus
        self.lockstatus=lockstatus
        super().__init__(name,description,openstatus,lockstatus)

class CageDoor(Door):
    def __init__(self):
        super().__init__(lockstatus=False,
                         openstatus=False,
                         name="Cage Door",
                         description="It's the door to the cage.")

main.py代码:

from tiles import CageDoor

CageDoor = CageDoor()

错误:

  File "main.py", line 3, in <module>
    CageDoor = CageDoor()
  *File Location*
    name="Cage Door"
TypeError: __init__() got an unexpected keyword argument 'name'

最佳答案

Door__init__ 不接受 namedescription,所以 中的调用CageDoor.__init__(它将控制传递给 Door.__init__ 因为 super() 确定它是继承层次结构中的下一个类)将失败。

Door.__init__ 更改为:

class Door(Scenery):
    def __init__(self,openstatus,lockstatus, *args, **kwargs):
        self.openstatus=openstatus
        self.lockstatus=lockstatus
        super().__init__(*args, **kwargs)

然后它将除了它使用的两个参数之外的所有参数无缝地传递给链上的下一个 __init__。接受和传递 *args**kwargs 的好处是,即使 Scenery 的构造函数原型(prototype)发生变化,Door 不必;如果没有提供默认值,调用者将需要传递正确的参数(因此向 Scenery 的构造函数添加新参数而不给它们有用的默认值是糟糕的形式),但是 Door 保持稳定。

关于python - super().__init__() 中的“意外关键字参数”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324247/

相关文章:

python类属性更新问题

python - pandas:根据时间序列数据中的索引查找最新值

python - sqlite3 数据库被锁定

python - 无法在 Python 的多处理中将两个列表组合成一个映射

python - 在另一台计算机上运行 pyinstaller .exe 文件时缺少 .dll

python - OrderedDict 中的最后一个元素

python - collections.deque 按值获取元素的索引

python - 如何使用 opencv 和 Python 读取用户的 "ctrl+q"输入?

python - 我们能否在不增加分类时间的情况下创建深度学习模型的集合?

python - 如何打印整个父-节点-子结构