解惑(一)-----super(XXX,lf).__init__()到底是代表什么含义

更新时间:2023-07-14 22:53:20 阅读: 评论:0

解惑(⼀)-----super(XXX,lf).__init__()到底是代表什么含义
好⽂不应该被埋没,然后我重新润⾊的⼀下,应该被更多的⼈所熟知
转载:
相信⼤家在很多场合特别是写神经⽹络的代码的时候都看到过下⾯的这种代码:
import torch
as nn
functional as F
class Net(nn.Module):
def__init__(lf):
super(Net, lf).__init__()
# 输⼊图像channel:1;输出channel:6;5x5卷积核
# an affine operation: y = Wx + b
lf.fc1 = nn.Linear(16*5*5,120)
lf.fc2 = nn.Linear(120,84)
lf.fc3 = nn.Linear(84,10)
def forward(lf, x):
# 2x2 Max pooling
x = F.max_v1(x)),(2,2))
# 如果是⽅阵,则可以只使⽤⼀个数字进⾏定义
x = F.max_v2(x)),2)
x = x.view(-1, lf.num_flat_features(x))
x = F.relu(lf.fc1(x))
x = F.relu(lf.fc2(x))
x = lf.fc3(x)
return x
⼤家可能刚开始会有点疑惑的是下⾯的这三⾏代码是⼲什么⽤的,要看懂这三⾏代码需要了解三个东西:
lf参数
__ init__ ()⽅法
super(Net, lf).init()
接下来就为⼤家逐⼀讲解⼀下。
⼀、lf参数
lf指的是实例Instance本⾝,在Python类中规定,函数的第⼀个参数是实例对象本⾝,并且约定俗成,把其名字写为lf,也就是说,类中的⽅法的第⼀个参数⼀定要是lf,⽽且不能省略。
我觉得关于lf有三点是很重要的:
lf指的是实例本⾝,⽽不是类
微笑的作用lf可以⽤this替代,但是不要这么去写
类的⽅法中的lf不可以省略
⾸先第⼀点lf指的是实例本⾝,⽽不是类
def eat(lf):
print(lf)
Bob=Person()
Bob.eat()
print(Person)
看输出的结果我们可以看到,lf指的是实例对象,并不是⼀个类
第⼆点lf可以⽤this替代,但是不要这么去写,其实我理解lf就相当于Java中的this,我们试着换⼀下
class Person():
def eat(this):
print(this)
Bob=Person()
Bob.eat()
print(Person)
环境监管
是没有报错的,但是⼤家还是按照规范⽤lf
第三点类的⽅法中的lf不可以省略,看下⾯的代码,pycharm⾃动提⽰需要参数lf。
⼆、__ init__ ()⽅法
在python中创建类后,通常会创建⼀个\ __ init__ ()⽅法,这个⽅法会在创建类的实例的时候⾃动执⾏。 \ __ init__ ()⽅法必须包含⼀个lf参数,⽽且要是第⼀个参数。
⽐如下⾯例⼦中的代码,我们在实例化Bob这个对象的时候,\ __ init__ ()⽅法就已经⾃动执⾏了,但是如果不是\ __ init__ ()⽅法,⽐如说eat()⽅法,那肯定就只有调⽤才执⾏
class Person():
def__init__(lf):
print("是⼀个⼈")
def eat(lf):
print("要吃饭")
Bob=Person()
再⽐如说下⾯的代码,如果 \ __ init__ ()⽅法中还需要传⼊另⼀个参数name,但是我们在创建Bob的实例的时候没有传⼊name,那么程序就会报错, 说我们少了⼀个\ __ init__ ()⽅法的参数,因为\ __ init__ ()⽅法是会在创建实例的过程中⾃动执⾏的,这个时候发现没有name参数,肯定就报错了!
def__init__(lf,name):
print("是⼀个⼈")
lf.name=name信息化建设工作总结
def eat(lf):
print("%s要吃饭"%lf.name)
Bob=Person()
Bob.eat()
传⼊了Bob之后就不会了,⽽且eat⽅法也可以使⽤name这个参数。
class Person():
def__init__(lf,name):
print("是⼀个⼈")
lf.name=name
def eat(lf):
print("%s要吃饭"%lf.name)
Bob=Person('Bob')
Bob.eat()
这样我们其实就⽐较清晰的知道什么东西需要在\ __ init__ ()⽅法中定义了,就是希望有⼀些操作是在创建实例的时候就有的时候,⽐如说下⾯的这个代码,其实就应该把money这个量定义在\ __ init__ ()⽅法中,这样就不需要在执⾏eat()⽅法后再执⾏qian()⽅法。或者说我们写神经⽹络的代码的时候,⼀些⽹络结构的设置,也最好放在\ __ init__ ()⽅法中。
class Person():月经量少吃什么
def__init__(lf,name):
print("是⼀个⼈")
lf.name=name
def eat(lf,money):
print("%s要吃饭"%lf.name)
<=money
def qian(lf):
print("花了%s元"%lf.money)
Bob=Person('Bob')
Bob.eat(12)
Bob.qian()
三、super(Net, lf).__init__()
Python中的super(Net, lf).__init__()是指⾸先找到Net的⽗类(⽐如是类NNet),然后把类Net的对象lf转换为类NNet的对象,然
后“被转换”的类NNet对象调⽤⾃⼰的init函数,其实简单理解就是⼦类把⽗类的__init__()放到⾃⼰的__init__()当中,这样⼦类就有了⽗类的__init__()的那些东西。
回过头来看看我们的我们最上⾯的代码,Net类继承nn.Module,super(Net, lf).__init__()就是对继承⾃⽗类nn.Module的属性进⾏初始化。⽽且是⽤nn.Module的初始化⽅法来初始化继承的属性。
class Net(nn.Module):
def__init__(lf):
super(Net, lf).__init__()
# 输⼊图像channel:1;输出channel:6;5x5卷积核
清正廉洁的名言警句
也就是说,⼦类继承了⽗类的所有属性和⽅法,⽗类属性⾃然会⽤⽗类⽅法来进⾏初始化。
举个例⼦帮助⼤家理解:
class Person:
def__init__(lf,name,gender):
lf.name = name
def printinfo(lf):
print(lf.der)
class Stu(Person):
def__init__(lf,name,gender,school):
super(Stu, lf).__init__(name,gender)# 使⽤⽗类的初始化⽅法来初始化⼦类
lf.school = school
愁眉苦脸的意思def printinfo(lf):# 对⽗类的printinfo⽅法进⾏重写
print(lf.der,lf.school)
if __name__ =='__main__':
stu = Stu('djk','man','nwnu')
stu.printinfo()
当然,如果初始化的逻辑与⽗类的不同,不使⽤⽗类的⽅法,⾃⼰重新初始化也是可以的。⽐如:
class Person(object):
def__init__(lf,name,gender,age):
lf.name = name
grandparents
lf.age = age
class Student(Person):
def__init__(lf,name,gender,age,school,score):
#super(Student,lf).__init__(name,gender,age)
lf.name = name.upper()
与其抱怨不如努力lf.gender = gender.upper()
lf.school = school
lf.score = score
s = Student('Alice','female',18,'Middle school',87)
print s.school
print s.name

本文发布于:2023-07-14 22:53:20,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1096862.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:sql乘法运算
标签:代码   实例   时候
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图