【问题标题】:Class Initialization [duplicate]类初始化[重复]
【发布时间】:2013-02-10 18:31:52
【问题描述】:

我只有一个关于初始化的小问题。在Python中,当我们进行Multiply继承时,调用子类的超函数和分别调用它们有什么区别?

classA(B,C)

super(A,self).__init__()

#---and---#

B.__init__(self)
C.__init__(self)

谢谢

【问题讨论】:

  • 您的意思是将super() inside 放在A 的__init__() 方法中吗?请修复您的代码,此代码将生成(明显的)IndentationError,以及 classA 的 NameError。
  • 哦,对不起。我只是简短地写了它:D

标签: python pyqt


【解决方案1】:

主要区别在于,如果类 B 和 C 有一个共同的祖先,使用 super() 调用,则该祖先的 __init__() 只会被调用一次。通过显式调用父母的 __init__() 方法(如您的示例),共同祖先的 __init__() 最终将被调用两次。

您可以从Guido's explanation 了解super() 如何完成此任务。

以下是对父母__init__() 的显式调用以及它如何两次调用共同祖先的演示:

>>> class A(object):
...   def __init__(self):
...     print "A"
... 
>>> class B(A):
...   def __init__(self):
...     A.__init__(self)
...     print "B"
... 
>>> class C(A):
...   def __init__(self):
...     A.__init__(self)
...     print "C"
... 
>>> class D(B,C):
...   def __init__(self):
...     B.__init__(self)
...     C.__init__(self)
...     print "D"
... 
>>> D()
A
B
A
C
D
<__main__.D object at 0x106de1d10>
>>> 

这就是super()所发生的事情

>>> class A(object):
...   def __init__(self):
...     print "A"
... 
>>> class B(A):
...   def __init__(self):
...     super(B,self).__init__()
...     print "B"
... 
>>> class C(A):
...   def __init__(self):
...     super(C,self).__init__()
...     print "C"
... 
>>> class D(B,C):
...   def __init__(self):
...     super(D,self).__init__()
...     print "D"
... 
>>> D()
A
C
B
D
<__main__.D object at 0x10d34ec90>
>>> 

【讨论】:

  • 啊,我明白了。非常感谢:D
猜你喜欢
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2020-08-07
  • 2017-12-30
  • 2013-07-12
  • 2018-05-02
相关资源
最近更新 更多