首頁  >  文章  >  後端開發  >  Python如何使用super()函數的__init__()方法?

Python如何使用super()函數的__init__()方法?

WBOY
WBOY轉載
2023-04-27 10:13:131833瀏覽

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

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

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

#1.1、super()

Python如何使用super()函數的__init__()方法?

需要注意的是python2、3的super写法稍有不同。
#1.2、 __ init __()

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

Python如何使用super()函數的__init__()方法?

定义类时可以不写init方法,系统会默认创建,
你也可以写一个,让你的类在创建时完成一些“动作”。
1.3、super(). __ init __()

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

Python如何使用super()函數的__init__()方法?

當然,在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的繼承順序

Python如何使用super()函數的__init__()方法?

Python如何使用super()函數的__init__()方法?

我們發現G繼承自E, F是並列的,初始化的時候不會先把E初始化完畢才初始化F。

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

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

4.1、實例

Python如何使用super()函數的__init__()方法?

#子類別名稱 繼承內容
Puple 繼承所有
Puple_Init 繼承,但覆寫了init方法

Python如何使用super()函數的__init__()方法?

Python如何使用super()函數的__init__()方法?

################### ###Puple_Super######繼承,但覆寫了init方法,並在init裡面加入了super().__init__()############### 4.2、執行結果與比較###############4.3、完整程式碼############

以上是Python如何使用super()函數的__init__()方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除