解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义
好文不应该被埋没,然后我重新润色的一下,应该被更多的人所熟知!!!
转载:https://blog.csdn.net/zyh19980527/article/details/107206483/
相信大家在很多场合特别是写神经网络的代码的时候都看到过下面的这种代码:
import torch
import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super(Net, self).__init__()# 输入图像channel:1;输出channel:6;5x5卷积核self.conv1 = nn.Conv2d(1, 6, 5)self.conv2 = nn.Conv2d(6, 16, 5)# an affine operation: y = Wx + bself.fc1 = nn.Linear(16 * 5 * 5, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):# 2x2 Max poolingx = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))# 如果是方阵,则可以只使用一个数字进行定义x = F.max_pool2d(F.relu(self.conv2(x)), 2)x = x.view(-1, self.num_flat_features(x))x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x
大家可能刚开始会有点疑惑的是下面的这三行代码是干什么用的,要看懂这三行代码需要了解三个东西:
- self参数
- __ init__ ()方法
- super(Net, self).init()
接下来就为大家逐一讲解一下。
一、self参数
self指的是实例Instance本身,在Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self,也就是说,类中的方法的第一个参数一定要是self,而且不能省略。
我觉得关于self有三点是很重要的:
- self指的是实例本身,而不是类
- self可以用this替代,但是不要这么去写
- 类的方法中的self不可以省略
首先第一点self指的是实例本身,而不是类
class Person():def eat(self):print(self)Bob=Person()
Bob.eat()
print(Person)
看输出的结果我们可以看到,self指的是实例对象,并不是一个类
第二点self可以用this替代,但是不要这么去写,其实我理解self就相当于Java中的this,我们试着换一下
class Person():def eat(this):print(this)Bob=Person()
Bob.eat()
print(Person)
是没有报错的,但是大家还是按照规范用self
第三点类的方法中的self不可以省略,看下面的代码,pycharm自动提示需要参数self。
二、__ init__ ()方法
在python中创建类后,通常会创建一个\ __ init__ ()方法,这个方法会在创建类的实例的时候自动执行。 \ __ init__ ()方法必须包含一个self参数,而且要是第一个参数。
比如下面例子中的代码,我们在实例化Bob这个对象的时候,\ __ init__ ()方法就已经自动执行了,但是如果不是\ __ init__ ()方法,比如说eat()方法,那肯定就只有调用才执行
class Person():def __init__(self):print("是一个人")def eat(self):print("要吃饭" )
Bob=Person()
再比如说下面的代码,如果 \ __ init__ ()方法中还需要传入另一个参数name,但是我们在创建Bob的实例的时候没有传入name,那么程序就会报错, 说我们少了一个\ __ init__ ()方法的参数,因为\ __ init__ ()方法是会在创建实例的过程中自动执行的,这个时候发现没有name参数,肯定就报错了!
class Person():def __init__(self,name):print("是一个人")self.name=namedef eat(self):print("%s要吃饭" %self.name)Bob=Person()
Bob.eat()
传入了Bob之后就不会了,而且eat方法也可以使用name这个参数。
class Person():def __init__(self,name):print("是一个人")self.name=namedef eat(self):print("%s要吃饭" %self.name)Bob=Person('Bob')
Bob.eat()
这样我们其实就比较清晰的知道什么东西需要在\ __ init__ ()方法中定义了,就是希望有一些操作是在创建实例的时候就有的时候,比如说下面的这个代码,其实就应该把money这个量定义在\ __ init__ ()方法中,这样就不需要在执行eat()方法后再执行qian()方法。或者说我们写神经网络的代码的时候,一些网络结构的设置,也最好放在\ __ init__ ()方法中。
class Person():def __init__(self,name):print("是一个人")self.name=namedef eat(self,money):print("%s要吃饭" %self.name)self.money=moneydef qian(self):print("花了%s元" %self.money)Bob=Person('Bob')
Bob.eat(12)
Bob.qian()
三、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)
也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。
举个例子帮助大家理解:
class Person:def __init__(self,name,gender):self.name = nameself.gender = genderdef printinfo(self):print(self.name,self.gender)class Stu(Person):def __init__(self,name,gender,school):super(Stu, self).__init__(name,gender) # 使用父类的初始化方法来初始化子类self.school = schooldef printinfo(self): # 对父类的printinfo方法进行重写print(self.name,self.gender,self.school)if __name__ == '__main__':stu = Stu('djk','man','nwnu')stu.printinfo()
当然,如果初始化的逻辑与父类的不同,不使用父类的方法,自己重新初始化也是可以的。比如:
class Person(object):def __init__(self,name,gender,age):self.name = nameself.gender = genderself.age = ageclass 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 = schoolself.score = scores = Student('Alice','female',18,'Middle school',87)
print s.school
print s.name
解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义相关推荐
- super(Student,self).__init__()初始化的是什么东西?
继承不是为了继承里面原来的属性和值么,不初始化的话,会有什么问题? 2015-04-04源自:python进阶 5-17642 浏览2 回答 最佳回答 2015-05-05 1 super(Stude ...
- super(Net,self).__init__() 的含义
class Net(nn.Module):def __init__(self):super(Net,self).__init__() python中的super(Net, self).init() 首 ...
- python到底是啥_Python语言中的__init__到底是干什么的?
本文主要向大家介绍了Python语言中的__init__到底是干什么的?通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 看到Python中有个函数名比较奇特,__init__我知道 ...
- python学习之类class继承、super()使用和__init__初始化
类的学习.__init__学习和super方法学习 1.python中类的属性.方法学习 2. 类的实例方法.类方法.静态方法 3.类class的访问控制:单划线_与双划线__ 4.继承中的__ini ...
- self参数 - __ init__ ()方法 super(Net, self).__init__()是什么
相信大家在很多场合特别是写神经网络的代码的时候都看到过下面的这种代码: import torch import torch.nn as nn import torch.nn.functional as ...
- Lua中 'local xxx do ... end' 到底表达了什么
前言 在一些lua的项目中偶尔会发现local xxx do ... end这种写法,那么这种写法有什么作用,或者说这么写又有什么好处呢?下面我们来逐步分析一下. 分析 首先实际代码中的写法可能看起来 ...
- super(XXXX,self).__init__()在类中的作用
这是对继承自父类的属性进行初始化.而且是用父类的初始化方法来初始化继承的属性. 也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化. 当然,如果初始化的逻辑与父类的不同,不 ...
- 解惑篇|Docker和 K8s 到底啥关系?想学K8s,必须得先学 Docker 吗?
想学K8s,必须得先学会 Docker 吗?这是很多网友在开始琢磨着想要学 K8s 的时候都会冒出来的想法.那么今天我们就跟大家说说这个话题,要回答这个问题,我们需要先搞清楚 Docker 和 K8s ...
- Kafka 中 SASL ACL SSL 到底分别代表什么意思
Kafka 中 SASL ACL SSL 分别代表什么意思 auth: huangyichun date: 2023-5-11 序 看各类帖子都没能指出这些到底是什么意思,他们是冲突的,还是互相作用的 ...
最新文章
- LeetCode-剑指 Offer 15. 二进制中1的个数
- js中字符替换函数String.replace()使用技巧
- 游戏AI研究(三):路径规划
- Net Core中数据库事务隔离详解——以Dapper和Mysql为例
- oracl 单行字符型函数
- stdint.h 文件
- Redis慢日志问题解决
- Android 屏幕(View)坐标系统
- AWS想到办法让Alexa能在毫秒内做出回复
- 论文的事情终于可以告一段落了
- eSIM物联网卡的优点有哪些
- 《深度学习Python实践》第22章——文本分类实例
- Latex 版本简历
- 算法提高——珠心算测验
- 家庭用计算机音响,7.1声道THX家庭影院音箱摆位计算器
- 第一行代码中过时的通知写法更正;
- 【测试方法】业务流测试法之场景法
- 一文教你如何有效做好广告投放
- java 性能优化小细节
- mac配置iOS开发环境