class Character(Entity):
def __init__(self, x, y, hp):
Entity.__init__(self, x, y)
self.hp = hp
self.items = []
Character
是父类Entity
的子类。 Entity
类还具有__init__
函数。为什么需要同时编写__init__
函数?为什么不只为__init__()
类写Character
,这会覆盖__init__()
的{{1}}?
答案 0 :(得分:3)
这取决于Entity.__init__
中发生的事情!如果(和仅当)所有内容设置为self.x
和self.y
,您可以执行以下操作:
class Character(Entity):
def __init__(self, x, y, hp):
self.x = x
self.y = y
self.hp = hp
self.items = []
但是这已经延长了一行,如果除了设置参数到实例属性之外的任何其他在Entity.__init__
中完成(例如,self.items = []
in { {1}})您的Character.__init__
可能无法正常运行。
最好调用超类的Character
方法,以确保完成所有需要完成的工作。
您可以使用__init__
:
super
因此,如果您更改class Character(Entity):
def __init__(self, x, y, hp):
super(Character, self).__init__(x, y)
从Character
继承的内容仍有效。
答案 1 :(得分:1)
你可以这样做,但是你不会调用超类(Entity
)的构造函数。在这种情况下,由构造函数来确保对象最终处于一致状态。
另一种方法是调用超类的构造函数,然后执行Character
实例所需的一些进一步操作。这意味着您已经拥有一个处于一致状态的对象(在Entity
构造函数完成之后)并且您只进行了特定于Character
个对象的进一步调整。
答案 2 :(得分:1)
为什么需要同时编写
__init__
函数?
没有。你在这里做了两件完全不同的事情:
Character.__init__
和Entity.__init__
。正如您已经注意到的那样,Character
的{{1}}方法会覆盖__init__
。因此,如果你想调用它,你需要现在从Entity
内明确地调用它。
答案 3 :(得分:0)
这取决于课程应该做什么。
如果我们假设课程分别启动他们自己的东西,那么你会看到
Entity
包含自己的属性x
和y
以及Character
包含其附加属性hp
和items
。您也可以将x
和y
的初始化设置为Character
,但那么Entity
本身和其他子类的初始化是什么?
答案 4 :(得分:0)
不添加上面已经说过的内容 - 将__init__方法称为构造函数是一个常见的错误 - 但它不是!
构造函数是__new__方法,很少使用。
Python文档在这个问题上有点神秘 - see here,但它从不直接调用构造函数。为什么?构造函数 - 在标准OOP术语中,创建类实例 - 对象 - 并返回它。 __init__只是没有做到!