首頁 > 軟體

python中super().__init__()作用詳解

2023-02-05 14:02:16

super().__ init__ ()有什麼用?

super().__init__() 、 super(B,self).__init__()

python裡的super().__init__()有什麼作用?很多同學沒有弄清楚。

super()用來呼叫父類別(基礎類別)的方法,__init__()是類的構造方法,
super().__init__() 就是呼叫父類別的init方法, 同樣可以使用super()去呼叫父類別的其他方法。

1、分別理解super()和 __ init __()

1.1、super()

需要注意的是python2、3的super寫法稍有不同。

1.2、__ init __()

__init__() 是python中的建構函式,在建立物件的時"自動呼叫"。

定義類時可以不寫init方法,系統會預設建立,
你也可以寫一個,讓你的類在建立時完成一些“動作”。

1.3、super(). __ init __()

如果子類B和父類別A,都寫了init方法,
那麼A的init方法就會被B覆蓋。想呼叫A的init方法需要用super去呼叫。

當然,在B內部,除了用super呼叫父類別的方法,也可以用父類別名呼叫,例:

class B(A):
    def __init__(self):
        A.__init__(self)
        print("B init")

1.3.1、關於“覆蓋”的疑問

有人可能會誤解“覆蓋”的意思,認為“覆蓋”了就是沒有,為什麼還能通過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()

2、super() 在 python2、3中的區別

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

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。

4、從多個範例中對比super(python3)

下面是三種不同的繼承、呼叫,對比他們的區別,搞清楚super().__init__()的用途。

4.1、範例

子類名稱繼承內容Puple繼承所有Puple_Init繼承,但覆蓋了init方法Puple_Super繼承,但覆蓋了init方法,並在init裡面新增了super().__init__()4.2、執行結果與對比

4.3、完整程式碼

到此這篇關於python中super().__init__()作用詳解的文章就介紹到這了,更多相關python中super().__init__()內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com