【python】详解类class的继承、__init__初始化、super方法

原文链接; https://blog.csdn.net/brucewong0516/article/details/79121179?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

通过之前四篇的介绍:

  • 【python】python中的类,对象,方法,属性初认识(一)详见链接
  • 【python】详解类class的属性:类数据属性、实例数据属性、特殊的类属性、属性隐藏(二)详见链接
  • 【python】详解类class的方法:实例方法、类方法、静态方法(三)详见链接
  • 【python】详解类class的访问控制:单下划线与双下划线_(四)详见链接

Python中类相关的一些基本点已经比较完整清晰了,本文继续深入Python中类的继承和_ _slots _ _属性。

1、继承

  • 在Python中,同时支持单继承与多继承,一般语法如下:
class SubClassName(ParentClass1 [, ParentClass2, ...]):class_suite
  • 1
  • 2
  • 实现继承之后,子类将继承父类的属性,也可以使用内建函数insubclass()来判断一个类是不是另一个类的子孙类
# -*- coding: utf-8 -*-
"""
Created on Sun Jan 21 22:33:09 2018

@author: BruceWong
“”"

class Parent(object):
‘’’
parent class
‘’’

numList = []
def numdiff(self, a, b):
return a-b

class Child(Parent):
pass

c = Child()
# subclass will inherit attributes from parent class
#子类继承父类的属性
Child.numList.extend(range(10))
print(Child.numList)

print(“77 - 2 =”, c.numdiff(77, 2))

# built-in function issubclass()
print(issubclass(Child, Parent))
print(issubclass(Child, object))

# bases can show all the parent classes
#bases属性查看父类
print(‘the bases are:’,Child.bases)

# doc string will not be inherited
#doc属性不会被继承
print(Parent.doc)
print(Child.doc)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

代码的输出为:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
77 - 2 = 75
True
True
the bases are: (<class '__main__.Parent'>,)
parent <span class="hljs-keyword">class</span>

None

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

例子中唯一特别的地方是文档字符串。文档字符串对于类,函数/方法,以及模块来说是唯一的,也就是说doc属性是不能从父类中继承来的。

2、继承中的_ _init_ _
当在Python中出现继承的情况时,一定要注意初始化函数_init_的行为:

  • 如果子类没有定义自己的初始化函数,父类的初始化函数会被默认调用;但是如果要实例化子类的对象,则只能传入父类的初始化函数对应的参数,否则会出错。
  • 如果子类定义了自己的初始化函数,而在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化
  • 如果子类定义了自己的初始化函数,在子类中显示调用父类,子类和父类的属性都会被初始化

2.1、子类没有定义自己的初始化函数,父类的初始化函数会被默认调用:

#定义父类:Parent
class Parent(object):def __init__(self, name):self.name = nameprint("create an instance of:", self.__class__.__name__)print("name attribute is:", self.name)
#定义子类Child ,继承父类Parent       
class Child(Parent):pass
#子类实例化时,由于子类没有初始化,此时父类的初始化函数就会默认被调用
#且必须传入父类的参数name
c = Child("init Child") 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

子类实例化时,由于子类没有初始化,此时父类的初始化函数就会默认被调用,此时传入父类的参数name,输出结果为:

create an instance of: Child
name attribute is: init Child
  • 1
  • 2

如果不传入父类的参数name:

class Parent(object):def __init__(self, name):self.name = nameprint("create an instance of:", self.__class__.__name__)print("name attribute is:", self.name)

class Child(Parent):
pass

#c = Child(“init Child”)
#print()
c = Child()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

没有传入父类name参数的输出结果会报错:

Traceback (most recent call last):

File “<ipython-input-11-9a7781a6f192>”, line 1, in <module>
runfile(‘C:/Users/BruceWong/.spyder-py3/类的继承.py’, wdir=‘C:/Users/BruceWong/.spyder-py3’)

File “C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”, line 866, in runfile
execfile(filename, namespace)

File “C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”, line 102, in execfile
exec(compile(f.read(), filename, ‘exec’), namespace)

File “C:/Users/BruceWong/.spyder-py3/类的继承.py”, line 54, in <module>
c = Child()

TypeError: init() missing 1 required positional argument: 'name’

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.2、子类定义了自己的初始化函数,而在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化

class Parent(object):def __init__(self, name):self.name = nameprint("create an instance of:", self.__class__.__name__)print("name attribute is:", self.name)
#子类继承父类        
class Child(Parent):#子类中没有显示调用父类的初始化函数def __init__(self):print("call __init__ from Child class")
#c = Child("init Child") 
#print()  
#将子类实例化  
c = Child()
print(c.name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化,因而此时调用子类中name属性不存在:
AttributeError: ‘Child’ object has no attribute ‘name’

call __init__ from Child class
Traceback (most recent call last):

File “<ipython-input-12-9a7781a6f192>”, line 1, in <module>
runfile(‘C:/Users/BruceWong/.spyder-py3/类的继承.py’, wdir=‘C:/Users/BruceWong/.spyder-py3’)

File “C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”, line 866, in runfile
execfile(filename, namespace)

File “C:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py”, line 102, in execfile
exec(compile(f.read(), filename, ‘exec’), namespace)

File “C:/Users/BruceWong/.spyder-py3/类的继承.py”, line 56, in <module>
print(c.name)

AttributeError: ‘Child’ object has no attribute 'name’

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.3、如果子类定义了自己的初始化函数,显示调用父类,子类和父类的属性都会被初始化

class Parent(object):def __init__(self, name):self.name = nameprint("create an instance of:", self.__class__.__name__)print("name attribute is:", self.name)

class Child(Parent):
def init(self):
print(“call init from Child class”)
super(Child,self).init(“data from Child”) #要将子类Child和self传递进去
#c = Child(“init Child”)
#print()
d = Parent(‘tom’)
c = Child()
print(c.name)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

子类定义了自己的初始化函数,显示调用父类,子类和父类的属性都会被初始化的输出结果:

#实例化父类Parent的结果
create an instance of: Parent
name attribute is: tom

#实例化子类Child的结果
call init from Child class
#super首先会先使得父类初始化的参数进行实例化
create an instance of: Child
name attribute is: data from Child
data from Child

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3、super的使用详解

  • super主要来调用父类方法来显示调用父类,在子类中,一般会定义与父类相同的属性(数据属性,方法),从而来实现子类特有的行为。也就是说,子类会继承父类的所有的属性和方法,子类也可以覆盖父类同名的属性和方法
class Parent(object):Value = "Hi, Parent value"def fun(self):print("This is from Parent")
#定义子类,继承父类               
class Child(Parent):Value = "Hi, Child  value"def ffun(self):print("This is from Child")

c = Child()
c.fun()
c.ffun()
print(Child.Value)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输出结果:

This is from Parent
This is from Child
Hi, Child value
  • 1
  • 2
  • 3

但是,有时候可能需要在子类中访问父类的一些属性,可以通过父类名直接访问父类的属性,当调用父类的方法是,需要将”self”显示的传递进去的方式

class Parent(object):Value = "Hi, Parent value"def fun(self):print("This is from Parent")

class Child(Parent):
Value = “Hi, Child value”
def fun(self):
print(“This is from Child”)
Parent.fun(self) #调用父类Parent的fun函数方法

c = Child()
c.fun()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

输出结果:

This is from Child
This is from Parent  #实例化子类Child的fun函数时,首先会打印上条的语句,再次调用父类的fun函数方法
  • 1
  • 2

这种方式有一个不好的地方就是,需要经父类名硬编码到子类中,为了解决这个问题,可以使用Python中的super关键字:

class Parent(object):Value = "Hi, Parent value"def fun(self):print("This is from Parent")

class Child(Parent):
Value = “Hi, Child value”
def fun(self):
print(“This is from Child”)
#Parent.fun(self)
super(Child,self).fun() #相当于用super的方法与上一调用父类的语句置换

c = Child()
c.fun()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输出结果:

This is from Child
This is from Parent  #实例化子类Child的fun函数时,首先会打印上条的语句,再次调用父类的fun函数方法
  • 1
  • 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

追剧计划第三弹!UC Berkeley出品,全栈深度学习!

关注卖萌屋比较早的小伙伴&#xff0c;大概还记得2020年初时我们组织的斯坦福大学CS224N自然语言处理公开课追剧计划&#xff0c;以及后来的斯坦福大学CS520知识图谱公开课追剧活动。尽管活动已经结束很长一段时间&#xff0c;但是仍然有小伙伴后台问“什么时候开始下一波追剧哇…

Android官方开发文档Training系列课程中文版:高效显示位图之在非UI线程中处理图片

原文地址&#xff1a;http://android.xsoftlab.net/training/displaying-bitmaps/process-bitmap.html 我们在上节课Load Large Bitmaps Efficiently中讨论了BitmapFactory.decode*方法&#xff0c;说到了不应该在UI线程中执行读取数据的过程&#xff0c;尤其是从磁盘或者网络…

美团外卖iOS App冷启动治理

一、背景 冷启动时长是App性能的重要指标&#xff0c;作为用户体验的第一道“门”&#xff0c;直接决定着用户对App的第一印象。美团外卖iOS客户端从2013年11月开始&#xff0c;历经几十个版本的迭代开发&#xff0c;产品形态不断完善&#xff0c;业务功能日趋复杂&#xff1b;…

LeetCode 538. 把二叉搜索树转换为累加树(逆中序 根右左)

文章目录1. 题目2. 逆中序&#xff08;根右左&#xff0c;降序循环遍历&#xff09;1. 题目 给定一个二叉搜索树&#xff08;Binary Search Tree&#xff09;&#xff0c;把它转换成为累加树&#xff08;Greater Tree)&#xff0c;使得每个节点的值是原来的节点值加上所有大于…

应用实践 | 电商应用——一种基于强化学习的特定规则学习模型

本文转载自公众号&#xff1a;浙大KG。作者&#xff1a;汪寒&#xff0c;浙江大学硕士&#xff0c;主要研究方向为知识图谱和自然语言处理。应用场景在电商实际应用中&#xff0c;每个商品都会被挂载到若干个场景&#xff0c;以图结构中的节点形式存在。商品由结构化信息表示&a…

20W奖金+实习机会:阿里巴巴达摩院最新时间序列赛事来了!

Datawhale赛事 赛事&#xff1a;2021“AI Earth”人工智能挑战赛2021“AI Earth”人工智能创新挑战赛&#xff0c;由阿里巴巴达摩院联合南京信息工程大学、国家气候中心、国家海洋环境预报中心、安徽省气象局共同创办。大赛以“AI助力精准气象和海洋预测”为主题&#xff0c;聚…

关于python中带下划线的变量和函数 的意义,class类带一个下划线和带两个下划线的定义

总结:变量:1. 前带_的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量2. 前带两个_ ,后带两个_ 的变量: 标明是内置变量,3. 大写加下划线的变量: 标明是 不会发生改变的全局变量函数:1. 前带_的变量: 标明是一个私有函数, 只用于标明,2. 前带两个_…

Android官方开发文档Training系列课程中文版:高效显示位图之位图缓存

原文地址&#xff1a;http://android.xsoftlab.net/training/displaying-bitmaps/cache-bitmap.html 往UI界面中加载单张图片的过程是很简单的&#xff0c;然而如果需要在某个时刻同时加载大量的图片&#xff0c;那么这事情就有些复杂了。在很多情况下&#xff0c;比如使用了L…

论文浅尝 | ICLR2020 - 基于组合的多关系图卷积网络

论文笔记整理&#xff1a;吴锐&#xff0c;东南大学计算机学院硕士。来源&#xff1a;ICLR 2020链接&#xff1a;https://arxiv.org/pdf/1911.03082.pdf动机目前针对于GCN的研究大多数都关注在学习无向图的结点表示上&#xff0c;然而我们在研究中更常见的通常是多关系图&#…

Hades:移动端静态分析框架

只有通过别人的眼睛&#xff0c;才能真正地了解自己 ——《云图》 背景 作为全球最大的互联网 生活服务平台&#xff0c;美团点评近年来在业务上取得了飞速的发展。为支持业务的快速发展&#xff0c;移动研发团队规模也逐渐从零星的小作坊式运营&#xff0c;演变为千人级研发军…

GitHub超级火!任意爬取,超全开源爬虫工具箱

文 | 程序员GitHub最近国内一位开发者在 GitHub 上开源了个集众多数据源于一身的爬虫工具箱——InfoSpider&#xff0c;一不小心就火了&#xff01;&#xff01;&#xff01;有多火呢&#xff1f;开源没几天就登上GitHub周榜第四&#xff0c;标星1.3K&#xff0c;累计分支 172 …

Android官方开发文档Training系列课程中文版:高效显示位图之管理位图内存

原文地址&#xff1a;http://developer.android.com/training/displaying-bitmaps/manage-memory.html 除了在上一节中描述的步骤之外&#xff0c;还有一些细节上的事情可以促进垃圾回收器的回收及位图的复用。其推荐的策略取决于Android的目标版本。示例APP BitmapFun展示了如…

Pytorch与tensorflow模型转换

使用pytorch_pretrained_bert将tensorflow模型转化为pytorch模型&#xff1a;https://blog.csdn.net/sunyueqinghit/article/details/103458365/ bert_config.json bert_model.ckpt.data-00000-of-00001 bert_model.ckpt.index bert_model.ckpt.meta vocab.txt 比如&#xff…

LeetCode 413. 等差数列划分(DP)

1. 题目 一个数列的等差数列子数组有多少个。 A [1, 2, 3, 4]返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]。2. 解题 状态公式 if(A[i]−A[i−1]A[i−1]−A[i−2]),thendp[i]dp[i−1]1,i>2if (A[i]-A[i-1] A[i-1]-A[i-2]) , \quad then \…

技术动态 | 针对复杂问题的知识图谱问答最新进展

本文转载自公众号&#xff1a;PaperWeekly。作者&#xff1a;付彬、唐呈光、李杨、余海洋、孙健单位&#xff1a;阿里巴巴达摩院小蜜Conversational AI团队背景介绍知识图谱问答&#xff08;KBQA&#xff09;利用图谱丰富的语义关联信息&#xff0c;能够深入理解用户问题并给出…

百度提出新冠高风险小区预警算法,AAAI21收录!

编&#xff1a;夕小瑶几个月前&#xff0c;小屋推送了一期上帝视角看新型冠状病毒&#xff08;COVID-19&#xff09;对公众出行影响的顶会论文解读——《这篇顶会paper&#xff0c;讲述了疫情期间憋疯的你和我》&#xff0c;这篇有趣的paper来自百度地图团队&#xff0c;发表在…

搜狗地图2016-Android-社招笔试题(包含Java基础部分)

下面是搜狗地图的社招笔试题&#xff0c;由于条件有限&#xff0c;全是手机拍的&#xff0c;请将就着看。另请忽略上面的答案&#xff0c;不一定准确。 大伙可在下方讨论答案&#xff0c;上方答案仅供参考&#xff0c;不一定准确。

机器学习常用的算法整理:线性回归、逻辑回归、贝叶斯分类、支持向量机、K-means聚类、决策树、随机森林以及常用的应用场景整理

什么是机器学习&#xff1f; 机器学习是计算机利用已有的数据(经验)得出了某种模型&#xff0c;并利用这些模型预测未来的一种方法。这个过程其实与人的学习过程极为相似&#xff0c;只不过机器是一个可以进行大维度数据分析而且可以不知疲倦地学习的“怪兽”而已。 具体的机器…

新一代数据库TiDB在美团的实践

1. 背景和现状 近几年&#xff0c;基于MySQL构建的传统关系型数据库服务&#xff0c;已经很难支撑美团业务的爆发式增长&#xff0c;这就促使我们去探索更合理的数据存储方案和实践新的运维方式。而随着分布式数据库大放异彩&#xff0c;美团DBA团队联合基础架构存储团队&#…

我在哥大读博的五年

文 | Mike Shou知乎&#xff08;ID&#xff1a;Showthem)本文已获作者授权&#xff0c;禁止二次转载0. 写在前面「 开始写这边总结的时候是三月&#xff0c;纽约成了疫情震中&#xff0c;看着新闻报道里的中央公园&#xff0c;中国城&#xff0c;第五大道&#xff0c;往事浮现&…