首頁 > 軟體

終於搞懂了Python中super(XXXX, self).__init__()的作用了

2022-08-05 18:01:56

在使用pytorch框架時,難免要自己定義網路。於是,super(XXXX, self).init(),就成了自定義網路結構時必不可少的第一句。但是,super(XXXX, self).init()具體的作用是什麼我一直沒有搞清楚。閱讀了大量的部落格後,我終於搞懂了!

一言以蔽之:super(XXX, self).init()——對繼承自父類別的屬性進行初始化,並且用父類別的初始化方法初始化繼承的屬性。

我們先看一個簡單的例子:

class Person():
    def __init__(self, name, gender):
        # 為name和gender賦值 
        self.name = name
        self.gender = gender
        
    def printinfo(self):
    
        print(self.name, self.gender)


# Stu類繼承Person類        

class Stu(Person):
    def __init__(self, name, gender, school):
    
        # 使用父類別的初始化方法來初始化子類name和gender屬性
        super(Stu, self).__init__(name, gender)  
        
        self.school = school
        
    def printinfo(self):   
        # 對父類別的printinfo方法進行重寫
       
        print(self.name, self.gender, self.school) 


    
if __name__=='__main__':
    stu = Stu('Bob', 'female', '5th')
    stu.printinfo()

>>>
Bob female 5th

當然,如果初始化的邏輯與父類別的不同,不使用父類別的方法,自己重新初始化也是可以的。比如:

class Person(object):
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age
        
# Student類繼承Person類
class Student(Person):
    def __init__(self, name, gender, age, school, score):
    
        # 呼叫父類別的初始化方法,初始化name、gender、age屬性
        super(Student, self).__init__(name,gender, age)
        
        # 對name、gender屬性進行改寫。age屬性仍保持父類別的初始化方法
        
        self.name = name.upper()  # 姓名改為大寫
        self.gender = gender.upper()  # 性別改為大寫
        self.school = school
        self.score = score
        
s = Student("Alice", "female", "18", "High school", "17")
print(s.name, s.gender, s.school, s.score)

>>>
ALICE FEMALE High school 17

在理解了上面的小例子後,我們再仔細研究一下機器學習中的程式碼:

class Net(nn.Module): # 繼承自nn.Moudle

    def __init__(self):
    
        super(Net, self).__init__()
        # 輸入影象channel:1;輸出channel:6;5x5折積核
        self.conv1 = nn.Conv2d(1, 6, 5)

super(Net, self).init()的含義:子類Net類繼承父類別nn.Module,super(Net, self).init()就是對繼承自父類別nn.Module的屬性進行初始化。並且是用nn.Module的初始化方法來初始化繼承的屬性。

也就是:用父類別的方法初始化子類的屬性。

有的人肯定會問,為啥要用父類別的方法去初始化屬性呢?原因很簡單:就是因為父類別的方法已經寫好了,我們只需要呼叫就可以了。難道你還想自己寫一堆程式碼去初始化各種權重和引數,處理一堆forward和backward的邏輯嗎?

最後,多一句嘴,介紹一寫在python中__init()的作用

在python中建立類後,通常會建立一個 init__ ()方法,這個方法會在建立類的範例的時候自動執行。

範例1:【範例化Bob這個物件的時候, __ init__ ()方法會自動執行】:

在下面的範例中,我們在範例化Bob這個物件的時候, __ init__ ()方法就已經自動執行了,如果不是__ init__ ()方法,比如說eat()方法,那就只有在呼叫時才會執行。

class Person():
    def __init__(self):
        print("是一個人")
    def eat(self):
        print("要吃飯")
        
Bob = Person()

>>>
是一個人

【範例2】哪些需放入__ init__ ()方法中,哪些不需要???

需要在 __ init__ ()方法中定義:希望有一些操作是在建立範例的時候就自動建立的。在神經網路程式碼中,一些網路結構的設定,也最好放在 __ init__ ()方法中。

在下述程式碼中,我們把money這個屬性也定義在__ init__ ()方法中,這樣就不需要在執行eat()方法後再執行qian()方法。

class Person():
    def __init__(self, name,money):
        print("是一個人")
        self.name = name
        self.money = money

    def eat(self):
        print("%s要吃飯" % self.name)

    def qian(self):
        print("花了%s元" % self.money)


Bob = Person("Bob",12)
Bob.eat()
Bob.qian()

>>>
是一個人
Bob要吃飯
花了12元

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


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