除了super()之外,还有哪些其他方法可以调用Parent的__init__方法?

时间:2017-04-17 22:30:52

标签: python

我正在尝试使用Child类调用并使用Parent的__init__method,除了在Child中使用super()方法之外,还有哪些其他方法可以执行此操作?我被告知要避免使用super(),因此我想知道。

# -*- coding: utf-8 -*-

class Room(object):

    def __init__(self, current_room):
        self.current_room = current_room
        print("You are now in Room #{}".format(self.current_room))

class EmptyStartRoom(Room):

    def __init__(self, current_room=1):
        super().__init__(current_room)

class ChestRoomKey1(Room):

    def __init__(self, current_room=2):
        super().__init__(current_room)

a_room = EmptyStartRoom()
other_room = ChestRoomKey1()

从上面的代码我得到:

你现在在1号房间

你现在在2号房间

2 个答案:

答案 0 :(得分:0)

您还可以在传递self参数的同时直接调用基类:

# -*- coding: utf-8 -*-
class Room(object):    
    def __init__(self, current_room):
        self.current_room = current_room
        print("You are now in Room #{}".format(self.current_room))

class EmptyStartRoom(Room):    
    def __init__(self, current_room=1):
        Room.__init__(self, current_room)

class ChestRoomKey1(Room):    
    def __init__(self, current_room=2):
        Room.__init__(self, current_room)

a_room = EmptyStartRoom()
other_room = ChestRoomKey1()

您还应该查看this帖子,告诉您为什么 应该}在开始进行多重继承时考虑使用super(),但就目前而言,两种方式都很好

答案 1 :(得分:0)

不要试图寻找其他选择。

它们可能是可能的,但您最终会硬编码超类(请参阅@abccd答案)或使用"您自己的MRO解决方案"。但是从长远来看,避免super()会变成维护噩梦(现在实施更难)

在你的情况下,你正在做正确的事!这个例子有点奇怪,因为__init__方法之间的唯一区别是参数的默认值,但我想这只是为了说明问题,对吧?