終于搞懂了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ì)繼承自父類的屬性進(jìn)行初始化,并且用父類的初始化方法初始化繼承的屬性。
我們先看一個(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類繼承Person類 ? ? ? ?
class Stu(Person):
? ? def __init__(self, name, gender, school):
? ??
? ? ? ? # 使用父類的初始化方法來(lái)初始化子類name和gender屬性
? ? ? ? super(Stu, self).__init__(name, gender) ?
? ? ? ??
? ? ? ? self.school = school
? ? ? ??
? ? def printinfo(self): ??
? ? ?? ?# 對(duì)父類的printinfo方法進(jìn)行重寫
? ? ? ?
? ? ? ? print(self.name, self.gender, self.school)?
? ??
if __name__=='__main__':
? ? stu = Stu('Bob', 'female', '5th')
? ? stu.printinfo()
>>>
Bob female 5th當(dāng)然,如果初始化的邏輯與父類的不同,不使用父類的方法,自己重新初始化也是可以的。比如:
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):
? ??
? ? ?? ?# 調(diào)用父類的初始化方法,初始化name、gender、age屬性
? ? ? ? super(Student, self).__init__(name,gender, age)
? ? ? ??
? ? ? ? # 對(duì)name、gender屬性進(jìn)行改寫。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在理解了上面的小例子后,我們?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()的含義:子類Net類繼承父類nn.Module,super(Net, self).init()就是對(duì)繼承自父類nn.Module的屬性進(jìn)行初始化。并且是用nn.Module的初始化方法來(lái)初始化繼承的屬性。
也就是:用父類的方法初始化子類的屬性。
有的人肯定會(huì)問(wèn),為啥要用父類的方法去初始化屬性呢?原因很簡(jiǎn)單:就是因?yàn)楦割惖姆椒ㄒ呀?jīng)寫好了,我們只需要調(diào)用就可以了。難道你還想自己寫一堆代碼去初始化各種權(quán)重和參數(shù),處理一堆forward和backward的邏輯嗎?
最后,多一句嘴,介紹一寫在python中__init()的作用
在python中創(chuàng)建類后,通常會(huì)創(chuàng)建一個(gè) init__ ()方法,這個(gè)方法會(huì)在創(chuàng)建類的實(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-10
python實(shí)現(xiàn)數(shù)據(jù)圖表
plotly是現(xiàn)代平臺(tái)的敏捷商業(yè)智能和數(shù)據(jù)科學(xué)庫(kù),它作為一款開源的繪圖庫(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-07
python使用for循環(huán)和海龜繪圖實(shí)現(xiàn)漂亮螺旋線
這篇文章主要為大家介紹了python使用for循環(huán)和海龜繪圖實(shí)現(xiàn)漂亮螺旋線實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python實(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-11
django認(rèn)證系統(tǒng) Authentication使用詳解
這篇文章主要介紹了django認(rèn)證系統(tǒng) Authentication使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

