嵌套构造函数。为什么需要它?

时间:2014-01-14 15:32:13

标签: python oop python-2.7

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}}?

5 个答案:

答案 0 :(得分:3)

这取决于Entity.__init__中发生的事情!如果(和仅当)所有内容设置为self.xself.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包含自己的属性xy以及
  • Character包含其附加属性hpitems

您也可以将xy的初始化设置为Character,但那么Entity本身和其他子类的初始化是什么?

答案 4 :(得分:0)

不添加上面已经说过的内容 - 将__init__方法称为构造函数是一个常见的错误 - 但它不是
构造函数是__new__方法,很少使用。 Python文档在这个问题上有点神秘 - see here,但它从不直接调用构造函数。为什么?构造函数 - 在标准OOP术语中,创建类实例 - 对象 - 并返回它。 __init__只是没有做到