python中新式類和經典類

2020-08-12 16:27:09

python中的類分爲新式類和經典類,具體有什麼區別呢?簡單的說,

1.新式類都從object繼承,經典類不需要。

  • Python 2.x中預設都是經典類,只有顯式繼承了object纔是新式類

  • Python 3.x中預設都是新式類,不必顯式的繼承object

2.經典類繼承深度優先,新式類繼承廣度優先。

在多重繼承關係下,子類的範例物件想要呼叫父類別的方法,向上尋找時的順序。

3.新式類相同父類別只執行一次建構函式,經典類重複執行多次。

class A:
 
  def __init__(self):
    print 'a',
class B(A):
  def __init__(self):
    A().__init__()
    print 'b',
class C(A):
  def __init__(self):
    A().__init__()
    print 'c',
class D(B,C):
  def __init__(self):
    B().__init__()
    C().__init__()
    print 'd',
 
class E(D,A):
  def __init__(self):
    D().__init__()
    A().__init__()
    print  'e',
d=D()
print ''
e=E()

程式碼執行後列印如下:

a a b a a b a a c a a c d 
a a b a a b a a c a a c d a a b a a b a a c a a c d a a e

第一行應該按如下分組a a b 、a a b |a a c 、a a c| d。首先執行D的init函數,D的init包含B和C的init,都執行之後纔會執行print d,至於爲什麼顯示執行了兩次建構函式,這個取決於類內部的call方法,之後介紹。

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:778463939
尋找有志同道合的小夥伴,互幫互助,羣裡還有不錯的視訊學習教學和PDF電子書!
'''
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',
class E(D,A):
  def __init__(self):
    super(E,self).__init__()
    print  'e',
d=D()
print ''
e=E()

結果列印如下:

a c b d 
a c b d e