終于搞懂了Python中super(XXXX,?self).__init__()的作用了
在使用pytorch框架時(shí),難免要自己定義網(wǎng)絡(luò)。于是,super(XXXX, self).init(),就成了自定義網(wǎng)絡(luò)結(jié)構(gòu)時(shí)必不可少的第一句。但是,super(XXXX, self).init()具體的作用是什么我一直沒(méi)有搞清楚。閱讀了大量的博客后,我終于搞懂了!
一言以蔽之:super(XXX, self).init()——對(duì)繼承自父類(lèi)的屬性進(jìn)行初始化,并且用父類(lèi)的初始化方法初始化繼承的屬性。
我們先看一個(gè)簡(jiǎn)單的例子:
class Person(): ? ? def __init__(self, name, gender): ? ? ?? ?# 為name和gender賦值? ? ? ? ? self.name = name ? ? ? ? self.gender = gender ? ? ? ?? ? ? def printinfo(self): ? ?? ? ? ? ? print(self.name, self.gender) # Stu類(lèi)繼承Person類(lèi) ? ? ? ? class Stu(Person): ? ? def __init__(self, name, gender, school): ? ?? ? ? ? ? # 使用父類(lèi)的初始化方法來(lái)初始化子類(lèi)name和gender屬性 ? ? ? ? super(Stu, self).__init__(name, gender) ? ? ? ? ?? ? ? ? ? self.school = school ? ? ? ?? ? ? def printinfo(self): ?? ? ? ?? ?# 對(duì)父類(lèi)的printinfo方法進(jìn)行重寫(xiě) ? ? ? ? ? ? ? ? print(self.name, self.gender, self.school)? ? ?? if __name__=='__main__': ? ? stu = Stu('Bob', 'female', '5th') ? ? stu.printinfo() >>> Bob female 5th
當(dāng)然,如果初始化的邏輯與父類(lèi)的不同,不使用父類(lèi)的方法,自己重新初始化也是可以的。比如:
class Person(object): ? ? def __init__(self, name, gender, age): ? ? ? ? self.name = name ? ? ? ? self.gender = gender ? ? ? ? self.age = age ? ? ? ?? # Student類(lèi)繼承Person類(lèi) class Student(Person): ? ? def __init__(self, name, gender, age, school, score): ? ?? ? ? ?? ?# 調(diào)用父類(lèi)的初始化方法,初始化name、gender、age屬性 ? ? ? ? super(Student, self).__init__(name,gender, age) ? ? ? ?? ? ? ? ? # 對(duì)name、gender屬性進(jìn)行改寫(xiě)。age屬性仍保持父類(lèi)的初始化方法 ? ? ? ?? ? ? ? ? self.name = name.upper() ?# 姓名改為大寫(xiě) ? ? ? ? self.gender = gender.upper() ?# 性別改為大寫(xiě) ? ? ? ? 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
在理解了上面的小例子后,我們?cè)僮屑?xì)研究一下機(jī)器學(xué)習(xí)中的代碼:
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()的含義:子類(lèi)Net類(lèi)繼承父類(lèi)nn.Module,super(Net, self).init()就是對(duì)繼承自父類(lèi)nn.Module的屬性進(jìn)行初始化。并且是用nn.Module的初始化方法來(lái)初始化繼承的屬性。
也就是:用父類(lèi)的方法初始化子類(lèi)的屬性。
有的人肯定會(huì)問(wèn),為啥要用父類(lèi)的方法去初始化屬性呢?原因很簡(jiǎn)單:就是因?yàn)楦割?lèi)的方法已經(jīng)寫(xiě)好了,我們只需要調(diào)用就可以了。難道你還想自己寫(xiě)一堆代碼去初始化各種權(quán)重和參數(shù),處理一堆forward和backward的邏輯嗎?
最后,多一句嘴,介紹一寫(xiě)在python中__init()的作用
在python中創(chuàng)建類(lèi)后,通常會(huì)創(chuàng)建一個(gè) init__ ()方法,這個(gè)方法會(huì)在創(chuàng)建類(lèi)的實(shí)例的時(shí)候自動(dòng)執(zhí)行。
實(shí)例1:【實(shí)例化Bob這個(gè)對(duì)象的時(shí)候, __ init__ ()方法會(huì)自動(dòng)執(zhí)行】:
在下面的示例中,我們?cè)趯?shí)例化Bob這個(gè)對(duì)象的時(shí)候, __ init__ ()方法就已經(jīng)自動(dòng)執(zhí)行了,如果不是__ init__ ()方法,比如說(shuō)eat()方法,那就只有在調(diào)用時(shí)才會(huì)執(zhí)行。
class Person(): ? ? def __init__(self): ? ? ? ? print("是一個(gè)人") ? ? def eat(self): ? ? ? ? print("要吃飯") ? ? ? ?? Bob = Person() >>> 是一個(gè)人
【實(shí)例2】哪些需放入__ init__ ()方法中,哪些不需要???
需要在 __ init__ ()方法中定義:希望有一些操作是在創(chuàng)建實(shí)例的時(shí)候就自動(dòng)創(chuàng)建的。在神經(jīng)網(wǎng)絡(luò)代碼中,一些網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)置,也最好放在 __ init__ ()方法中。
在下述代碼中,我們把money這個(gè)屬性也定義在__ init__ ()方法中,這樣就不需要在執(zhí)行eat()方法后再執(zhí)行qian()方法。
class Person(): ? ? def __init__(self, name,money): ? ? ? ? print("是一個(gè)人") ? ? ? ? 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() >>> 是一個(gè)人 Bob要吃飯 花了12元
到此這篇關(guān)于終于搞懂了Python中super(XXXX, self).__init__()的作用了的文章就介紹到這了,更多相關(guān)Python super(XXXX, self).__init__()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)AdaBoost算法的示例
這篇文章主要介紹了python實(shí)現(xiàn)AdaBoost算法的示例,幫助大家更好的理解和了解機(jī)器學(xué)習(xí)算法,感興趣的朋友可以了解下2020-10-10python實(shí)現(xiàn)數(shù)據(jù)圖表
plotly是現(xiàn)代平臺(tái)的敏捷商業(yè)智能和數(shù)據(jù)科學(xué)庫(kù),它作為一款開(kāi)源的繪圖庫(kù),可以應(yīng)用于Python、R、MATLAB、Excel、JavaScript和jupyter等多種語(yǔ)言,主要使用的js進(jìn)行圖形繪制,實(shí)現(xiàn)過(guò)程中主要就是調(diào)用plotly的函數(shù)接口,底層實(shí)現(xiàn)完全被隱藏,便于初學(xué)者的掌握。2017-07-07python使用for循環(huán)和海龜繪圖實(shí)現(xiàn)漂亮螺旋線
這篇文章主要為大家介紹了python使用for循環(huán)和海龜繪圖實(shí)現(xiàn)漂亮螺旋線實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python實(shí)現(xiàn)PC屏幕截圖并自動(dòng)發(fā)送郵件
在當(dāng)前的數(shù)字化世界中,自動(dòng)化已經(jīng)成為我們?nèi)粘I詈凸ぷ髦械年P(guān)鍵部分,本文我們將探討如何使用Python來(lái)實(shí)現(xiàn)一個(gè)特定的自動(dòng)化任務(wù) - PC屏幕截圖自動(dòng)發(fā)送到指定的郵箱,感興趣的可以了解下2023-11-11django認(rèn)證系統(tǒng) Authentication使用詳解
這篇文章主要介紹了django認(rèn)證系統(tǒng) Authentication使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07