super().__init__() 、 super(B,self).__init__()
需要注意的是python2、3的super写法稍有不同。
__init__() 是python中的建構函數,在建立物件的時"自動呼叫"。
定义类时可以不写init方法,系统会默认创建, 你也可以写一个,让你的类在创建时完成一些“动作”。
如果子類別B和父類別A,都寫了init方法,
那麼A的init方法就會被B覆蓋。想呼叫A的init方法要用super去呼叫。
當然,在B內部,除了用super呼叫父類別的方法,也可以用父類別名稱調用,範例:
class B(A): def __init__(self): A.__init__(self) print("B init")
有人可能會誤解「覆蓋」的意思,認為「覆蓋」了就是沒有,為什麼還能透過super呼叫?
覆蓋了並不是沒有了,A的方法終都還在,但需要在B內部用super呼叫。
例: A里写了一个方法hi(), B继承自A, B里也写了一个方法hi()。 B的对象在外部调用hi(), 就只能调用B里面写的这个hi()。 想通过B调用A的hi(),只能在B内部用super().hi()调用。
class A: def hi(self): print("A hi") class B(A): def hello(self): print("B hello") b = B() b.hi() # B里没有写hi(),这里调用的是继承自A的hi() ------------------------------------------------------------------ class A: def hi(self): print("A hi") class B(A): def hi(self): print("B hi") b = B() b.hi() # 这里调用的就是B自己的hi() ------------------------------------------------------------------ class A: def hi(self): print("A hi") class B(A): def hi(self): super().hi() # 通过super调用父类A的hi() print("B hi") b = B() b.hi() # 这里调用的就是B里面的hi()
Python3.x 和Python2.x 的一個區別: Python 3 可以使用直接使用super().xxx 來取代super( Class, self).xxx :
例:
python3 直接寫成: super().__init__()
python2 必須寫成:super(本類別名稱,self).__init__( )
Python3.x 實例:
class A: def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super().add(x) b = B() b.add(2) # 3
Python2.x 實例:
#!/usr/bin/python # -*- coding: UTF-8 -*- class A(object): # Python2.x 记得继承 object def add(self, x): y = x+1 print(y) class B(A): def add(self, x): super(B, self).add(x) b = B() b.add(2) # 3
#最底層:先寫一個父類別A
class A: def __init__(self): print('A')
第二層:讓B、C、D 繼承自A
class B(A): def __init__(self): print('B') super().__init__() class C(A): def __init__(self): print('C') super().__init__() class D(A): def __init__(self): print('D') super().__init__()
第三層: E、F、G 繼承
class E(B, C): def __init__(self): print('E') super().__init__() class F(C, D): def __init__(self): print('F') super().__init__() class G(E, F): def __init__(self): print('G') super().__init__()
看看G的繼承順序
我們發現G繼承自E, F是並列的,初始化的時候不會先把E初始化完畢才初始化F。
下面是三種不同的繼承、調用,對比他們的區別,搞清楚super().__init__()的用途。
#子類別名稱 | 繼承內容 |
---|---|
Puple | 繼承所有 |
Puple_Init | 繼承,但覆寫了init方法 |
以上是Python如何使用super()函數的__init__()方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!