self引數 - __ init__ ()方法 super(Net, self).__init__()
阿新 • • 發佈:2020-08-24
self引數
self指的是例項Instance本身,在Python類中規定,函式的第一個引數是例項物件本身,並且約定俗成,把其名字寫為self,
也就是說,類中的方法的第一個引數一定要是self,而且不能省略。關於self有三點是很重要的:
self指的是例項本身,而不是類
self可以用this替代,但是不要這麼去寫
類的方法中的self不可以省略
class Person():
def eat(self):
print(self)
Alex = Person()
Alex.eat()
print(Person)
__ init__ ()方法
在python中建立類後,通常會建立一個 __ init__ ()方法,這個方法會在建立類的例項的時候自動執行
__ init__ ()方法必須包含一個self引數,而且要是第一個引數。
class Person():
def __init__(self):
print("是一個人")
#self.name = name
def eat(self):
print("吃飯")
Alex = Person()
是一個人
__ init__ ()方法就已經自動執行了,但是如果不是 __ init__ ()方法,比如說eat()方法,那肯定就只有呼叫才執行
再比如說下面的程式碼,如果 __ init__ ()方法中還需要傳入另一個引數name,但是
我們在建立Alex的例項的時候沒有傳入name,那麼程式就會報錯,
class Person():
def __init__(self,name):
print("是一個人")
self.name = name
def eat(self):
print("吃飯")
Alex = Person()
我們其實就比較清晰的知道什麼東西需要在__ init__ ()方法中定義了,就是希望有一些操作是在建立例項的時候就有,
我們寫神經網路的程式碼的時候,一些網路結構的設定,也最好放在__ init__ ()方法中。
super(Net, self).init()
python中的super(Net, self).init()是指首先找到Net的父類(比如是類NNet),然後把類Net的物件self轉換為類NNet的物件,然後“被轉換”的類NNet物件呼叫自己的init函式,
其實簡單理解就是子類把父類的__init__()放到自己的__init__()當中,這樣子類就有了父類的__init__()的那些東西。
Net類繼承nn.Module,super(Net, self).init()就是對繼承自父類nn.Module的屬性進行初始化。
而且是用nn.Module的初始化方法來初始化繼承的屬性。
class Net(nn.Module): def __init__(self): super(Net, self).__init__() # 輸入影象channel:1;輸出channel:6;5x5卷積核 self.conv1 = nn.Conv2d(1, 6, 5)
也就是說,子類繼承了父類的所有屬性和方法,父類屬性自然會用父類方法來進行初始化。
當然,如果初始化的邏輯與父類的不同,不使用父類的方法,自己重新初始化也是可以的。比如:
#!/usr/bin/env python # -*- coding:utf-8 -*- class Person(object): def __init__(self,name,gender,age): self.name = name self.gender = gender self.age = age class Student(Person): def __init__(self,name,gender,age,school,score): #super(Student,self).__init__(name,gender,age) self.name = name.upper() self.gender = gender.upper() self.school = school self.score = score s = Student('Alice','female',18,'Middle school',87) print (s.school) print (s.name)
Middle school
ALICE
class Person(object):#父類 def __init__(self, name, gender, age): self.name = name self.gender = gender self.age = age class Student(Person): def __init__(self, name, gender, age, school, score): super(Student,self).__init__(name,gender,age) # self.name = name.upper() # self.gender = gender.upper() self.school = school self.score = score s = Student('Alice', 'female', 18, 'Middle school', 87) print(s.school) print(s.name)
Middle school
Alice