在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
,又有两个类型B
,C
它们都从派生A
。然后,您有一个D
既继承自B
and的类型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时就会报