我正在写一个小型文字游戏。 尝试定义类变量时,我不断收到错误消息。
这是类代码:
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__
不接受 name
或 description
,所以 中的调用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/