1. 程式人生 > 實用技巧 >self引數 - __ init__ ()方法 super(Net, self).__init__()

self引數 - __ init__ ()方法 super(Net, self).__init__()

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