当前位置: 首页 > 面试题库 >

super()和直接调用超类之间的区别

董联
2023-03-14
问题内容

在Python 2.7和3中,我使用以下方法来调用超类的函数:

class C(B):
    def __init__(self):
        B.__init__(self)

我看到也可以在python3B.__init__(self)中用super(B, self).__init__()和替换super().__init__()

这两种方式都有什么优点或缺点?B至少直接从我这里调用它更有意义,但是也许有充分的理由super()只能在使用元类时使用(我通常会避免)。


问题答案:

对于单继承,super()只是引用基本类型的一种更简单的方法。这样,您可以使代码更具可维护性,例如,如果您想更改基本类型的名称。当您在super各处使用时,只需在class生产线中进行更改即可。

真正的好处是多重继承。使用时super,单个调用不仅会自动调用 所有 基本类型的方法(以正确的继承顺序),而且还会确保每个方法仅被调用一次。

本质上,这使类型具有菱形属性,例如,您有一个基本类型A,又有两个类型BC它们都从派生A。然后,您有一个D既继承自Band的类型C(又隐式地继承A了两次)。如果现在显式调用基本类型的方法,最终将两次调用A的方法。但是使用时super,它只会调用一次:

class A (object):
    def __init__ (self):
        super().__init__()
        print('A')

class B (A):
    def __init__ (self):
        super().__init__()
        print('B')

class C (A):
    def __init__ (self):
        super().__init__()
        print('C')

class D (C, B):
    def __init__ (self):
        super().__init__()
        print('D')

现在实例化时D,将获得以下输出:

>>> D()
A
B
C
D
<__main__.D object at 0x000000000371DD30>

现在,让我们再次手动调用基本类型的方法来完成所有操作:

class A2 (object):
    def __init__ (self):
        print('A2')

class B2 (A2):
    def __init__ (self):
        A2.__init__(self)
        print('B2')

class C2 (A2):
    def __init__ (self):
        A2.__init__(self)
        print('C2')

class D2 (C2, B2):
    def __init__ (self):
        B2.__init__(self)
        C2.__init__(self)
        print('D2')

这是输出:

>>> D2()
A2
B2
A2
C2
D2
<__main__.D2 object at 0x0000000003734E48>

如您所见,A2发生两次。这通常不是您想要的。当您手动调用使用的一种基本类型的方法时,它甚至变得更加混乱super。因此,相反,您应该只是super()用来确保一切正常,并且也不必担心太多。



 类似资料:
  • 问题内容: 查看下面的示例代码 和 当我问到代码差异时,我并不是在说执行流程,这是显而易见的。 那么这些代码之间的 真正 区别是什么?建议何时 在 通话 前 使用您的代码,何时 在 通话 后 使用您的代码?我想在某些情况下这很重要。 问题答案: 您不应在之前放置任何代码,因为此方法可以使系统执行正确暂停应用程序所需的操作。您要在回调中执行的所有代码都应放在调用之后。希望这可以帮助。 活动报价: 注

  • 问题内容: 直接使用和直接使用父类名称之间有区别吗?例如: 是否有内部之间的差异和? 问题答案: 在 这种情况下 不是。但是 通常 ,尤其是当您使用 多重继承时 ,按照文档中指定 的 方法 委托给 方法解析顺序(MRO)中 的下一个对象 : 返回将方法调用委托给类型的父级或同级类的 代理对象 。这对于访问已在类中重写的继承方法很有用。搜索顺序与所使用的顺序相同,只是类型本身被跳过。 类型的 属性列

  • 问题内容: 关键字和之间有什么区别? 两者都用来访问类的构造函数吧?你们任何人都可以解释吗? 问题答案: 让我们考虑这种情况 输出将是 第三行正在打印“ animal:eat”,因为我们正在调用。如果我们调用,它将被打印为“ dog:eat”。

  • 问题内容: 以下调用之间有区别吗? 与 应该首选哪一个? 问题答案: 这两个函数以截然不同的方式处理段。只会将它与前一个参数连接起来,但是会将其视为根目录,并忽略所有先前的路径- 将其视为与每个参数一起执行的结果: 要注意的另一件事是,它将始终产生绝对URL,并且将使用您的工作目录作为解析此路径的基础。但是,无论如何,这都是一条绝对路径,这对您而言并不重要。 对于您应该使用哪一个,答案是:这取决于

  • 我正在开发一个程序,允许用户在四支球队之间选择主客场足球队。我创建了一个通用的超类团队,它定义了每个安全/场球/达阵得分分配的点数。生成一个随机数,然后根据该数字,程序执行条件if/else语句,以确定动作和点。 这是在超类中: 注意:上面的初始化为 在整个过程中,我希望跟踪。我在我的超类中有这样的设置,然而,当程序运行时,它将整个游戏的分数相加,而不区分队伍。 客场团队行动。射门得分+3当前得分

  • 本文向大家介绍python类中super()和__init__()的区别,包括了python类中super()和__init__()的区别的使用技巧和注意事项,需要的朋友参考一下 单继承时super()和__init__()实现的功能是类似的 输出结果: 区别是使用super()继承时不用显式引用基类。 super()只能用于新式类中 把基类改为旧式类,即不继承任何基类 执行时,在初始化b时就会报