库中的torch.nn.Module模块,声明继承Model类时有提示可以按照这样方式书写

class Model(nn.Module):def __init__(self):super(Model, self).__init__()self.conv1 = nn.Conv2d(1, 20, 5)self.conv2 = nn.Conv2d(20, 20, 5)

其中的super类的作用是继承的时候,调用含super的各个的基类__init__函数,如果不使用super,就不会调用这些类的__init__函数,除非显式声明。而且使用super可以避免基类被重复调用。
使用 print(Model.mro)打印搜索顺序或者祖先树,被官方称为MRO即Method Resolution Order,

(<class ‘main.Model’>, <class ‘torch.nn.modules.module.Module’>, <class ‘object’>)
按这个顺序是从右至左调用,标准用法是:

class C(B):def method(self, arg):super().method(arg)    # This does the same thing as:# super(C, self).method(arg)

super的典型用法:
在具有单一继承结构的类层级中,super可以指代父类而不需要显式的声明,这对更改父类的时候是有帮助的;
在动态执行环境中支持多继承协作,这个功能是python独有的,使得有可能解决菱形图问题,指多个基类实现相同的方法。

先看第一个用法:

class A():def fortest(self):print('Call class A')print('Leave class A')
class B(A):def fortest(self):print('Call class B')A.fortest(self)print('Leave class B')
sample=B()
sample.fortest()
print(B.__mro__)

运行的结果:

Call class B
Call class A
Leave class A
Leave class B
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

如果需要更改B的基类A为D,那么不仅需要更改声明class B(D),函数体中的函数也要进行更改,如果调用A的地方多,修改起来就会很麻烦,加上super就简单很多

class A():def fortest(self):print('Call class A')print('Leave class A')
class B(A):def fortest(self):print('Call class B')super(B,self).fortest()#等同于super().fortest()print('Leave class B')
sample=B()
sample.fortest()
print(B.__mro__)运行的结果:
Call class B
Call class A
Leave class A
Leave class B
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

加上super以后,修改基类就只需要修改声明,不需要修改函数体内的东西,所以super可以指代父类而不需要显式的声明,这对更改基类的时候是有帮助的,使得代码更容易维护

接着看另外的用法:

class A():def __init__(self):print('Call class A')print('Leave class A')
class B(A):def __init__(self):print('Call class B')print('Leave class B')
class C(A):def __init__(self):print('Call class C')super(C,self).__init__()print('Leave class C')
class D(A):def __init__(self):print('Call class D')super(D, self).__init__()print('Leave class D')
class E(B,C):def __init__(self):print('Call class E')B.__init__(self)C.__init__(self)print('Leave class E')
sample=E()
print(E.__mro__)运行的结果:
Call class E
Call class B
Leave class B
Call class C
Call class A
Leave class A
Leave class C
Leave class E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

B和C类都继承的A,但是由于B没有使用super,这里调用B的时候没有调用A,只有C自动调用了A

class A():def __init__(self):print('Call class A')print('Leave class A')
class B(A):def __init__(self):print('Call class B')print('Leave class B')
class C(A):def __init__(self):print('Call class C')super(C,self).__init__()print('Leave class C')
class D(A):def __init__(self):print('Call class D')super(D, self).__init__()print('Leave class D')
class E(B,C,D):def __init__(self):print('Call class E')B.__init__()C.__init__()D.__init__()print('Leave class E')
sample=E()
print(E.__mro__)运行的结果:
Call class E
Call class B
Leave class B
Call class C
Call class D
Call class A
Leave class A
Leave class D
Leave class C
Call class D
Call class A
Leave class A
Leave class D
Leave class E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

这里的A和D都重复调用了一次,尤其是调用C的时候,也调用了D

class A():def __init__(self):print('Call class A')super(A, self).__init__()print('Leave class A')
class B(A):def __init__(self):print('Call class B')super(B,self).__init__()print('Leave class B')
class C(A):def __init__(self):print('Call class C')super(C,self).__init__()print('Leave class C')
class D(A):def __init__(self):print('Call class D')super(D, self).__init__()print('Leave class D')
class E(B,C,D):def __init__(self):print('Call class E')super(E, self).__init__()print('Leave class E')
sample=E()
print(E.__mro__)运行结果是:
Call class E
Call class B
Call class C
Call class D
Call class A
Leave class A
Leave class D
Leave class C
Leave class B
Leave class E
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)

都加super以后每个基类都只调用一次

作者:shiheyingzhe
来源:CSDN
原文:https://blog.csdn.net/shiheyingzhe/article/details/83051471
版权声明:本文为博主原创文章,转载请附上博文链接!

pytorch super 的用法相关推荐

  1. super的用法(带了解)

    super的用法(带了解) super的用法(带了解) posted on 2018-05-11 21:31 leolaosao 阅读(...) 评论(...) 编辑 收藏 转载于:https://w ...

  2. this super java_java中 this 和super的用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...

  3. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  4. java构造方法 this_Java中的构造方法this、super的用法详解

    1.构造方法 定义:与类同名没有返回值的方法称为构造方法: public class test1 { private String name; private int age; public test ...

  5. java 构造 super_Java中的构造方法this、super的用法详解

    1.构造方法 定义:与类同名没有返回值的方法称为构造方法: public class test1 { private String name; private int age; public test ...

  6. super()的用法

    super()的用法 super([type[, object-or-type]]) 返回一个代理对象,它会将方法调用委托给 type 指定的父类或兄弟类. 这对于访问已在类中被重载的继承方法很有用. ...

  7. 【python】类继承中super的用法

    阅读本文,需要知道python中的类与继承的概念. 1.总述 在python中,通过类的继承机制,可以实现在子类中调用父类的方法,从而避免写重复的代码.但在面临多继承时,如果多个父类中都实现了某个相同 ...

  8. Java中类关键字super的用法详解

    今天给大家总结介绍一下Java类中super关键字的用法. 文章目录 super关键字用法: 1.修饰属性,明确表示直接从父类中寻找同名属性 2.在子类中调用父类的方法 3.在子类中调用父类的构造方法 ...

  9. java中super的用法

    java中super的用法 super只在子类中出现 super有三种用法 [1] super.xxx; xxx可以是类的属性. 例如super.name;即从子类中获取父类name属性的值 [2]  ...

最新文章

  1. Web.config配置文件详解(新手必看)
  2. 业界资讯: Air 2.0 beta 版本 发布
  3. 每日一皮:资深老鸟看实习生写代码...
  4. kafka不使用自带zk_Kafka监控必备——Kafka-Eagle 2.0.2正式发布
  5. Kafka发送超过broker限定大小的消息时Client和Broker端各自会有什么异常?
  6. [CQOI2017] 老C的键盘(树形dp + 组合数)
  7. 在jsp中使用smartupload组件上传文件- -
  8. 50 MM配置-库存管理和实际库存-自动建立库存地点
  9. python读json文件太大github_GitHub上最火的开源项目是啥|JSON文件实战处理
  10. 控制文件夹递归深度_TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)...
  11. Python中 '==' 与'is' 以及它们背后的故事
  12. mysql in 通配符_mysql必知必会--用通配符进行过滤
  13. c语言对字符串逆序,【C语言】 字符串逆序
  14. 《软件需求模式》05
  15. UMLChina公众号文章精选(20220807更新精选)
  16. Android MediaRecorder录制视频
  17. P4839 P哥的桶C++题解
  18. 台信M18金属感应开关传感器三线NPN常开
  19. 02-SQL语句给表起别名SQL中的表连接
  20. 嵌入式存储设备学习笔记

热门文章

  1. 六面体体积求解(规则不规则)
  2. oracle 拉里 网线通道,拉里.埃里森:Oracle云计算服务进入超速增长阶段
  3. 观echat的一个例子后有感
  4. 自动下载RDS MySQL备份文件
  5. JAVA版商城 spring boot商城 spring cloud商城 B2B2C商城 多用户商城 直播带货商城 新零售商城 b2b供应链 电子商务 拼团商城 分销商城 直播商城 社交电商
  6. 科技“蝶变”,两轮电动车下一个五年的“新动力”
  7. CAD转换jpg的使用大全
  8. IDEA常用快捷键(四)--查找文件、查找类
  9. 微服务之RPC(远程过程调用)的四种方式
  10. 关于TI的28335芯片概述