Python类的继承

类的继承可以看成对类的属性和方法的重用,能够大大的减少代码量,继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹。

通过继承创建的新类为子类或者派生类,被继承的类称为基类、父类或超类

1、子类会继承父类所有的功能属性和方法,并且子类能够拥有自己的属性和方法;对原来的父类不会产生任何影响。单继承中只有一个父类,而多继承中有多个父类

2、调用属性和方法时,优先调用子类的,子类没有再调用父类的,当子类的属性和方法与父类的属性和方法名称重复时,以子类的属性和方法为准。

class Person(object):name='Person类name'age='Person类的age'def __init__(self,name,age):self.name=nameself.age=ageprint('这里是Person类的构造方法')def eat(self):print('%s 在吃饭(Person类eat方法)'%self.name)def sleep(self):print('%s 在睡觉(Person类sleep方法)'%self.name)
class Teacher(Person):name='Teacher类的name'def eat(self):print('%s 在吃饭(Teacher类eat方法)' %self.name)
test=Teacher('橙子',11)
test.eat()
test.sleep()这里是Person类的构造方法
橙子 在吃饭(Teacher类eat方法)
橙子 在睡觉(Person类sleep方法)
Process finished with exit code 0

如果子类有构造方法,未重写父类构造方法,实例化子类时,会调用子类构造方法,实例属性会先找子类的实例变量,再找子类类变量,最后找继承类的类变量

class Person(object):name = 'Person类name'age = 'Person类的age'def __init__(self,name,age):self.name=nameself.age=ageprint('这里是Person类的构造方法')class Teacher(Person):name='Teacher类的name'def __init__(self,age):self.age=ageprint('这里是Teacher类的构造方法')test = Teacher(20)
print(test.name,Teacher.name)
print(test.age,Teacher.age)这里是Teacher类的构造方法
Teacher类的name Teacher类的name
20 Person类的age
Process finished with exit code 0

如果子类没有构造方法,未重写父类构造方法,实例化子类时,会调用父类构造方法,实例属性会先找子类的实例变量,再找子类的类变量,最后找父类类变量,类属性会先找子类类变量,再找父类类变量

class Person(object):name = 'Person类name'age = 'Person类的age'def __init__(self,name,age):self.name=nameself.age=ageprint('这里是Person类的构造方法')class Teacher(Person):name='Teacher类的name'a=111test = Teacher('橙子',30)
print(test.name,test.a,Teacher.name)
print(test.age,Teacher.age)这里是Person类的构造方法
橙子 111 Teacher类的name
30 Person类的age
Process finished with exit code 0

3、多重继承时,有相同名称的属性和方法时,会优先找当前类下的属性和方法

class A(object):pass
class B(A):pass
class C(A):name='C类name'def func(self):print('C类func')
class D(C,B):name='D类name'def func(self):print('D类func')
test=D()
print(test.name)
test.func()D类name
D类func
Process finished with exit code 0

当前类下没有,再找继承写在前面的父类的属性和方法

class A(object):pass
class B(A):name='B类name'def func(self):print('B类func')
class C(A):name='C类name'def func(self):print('C类func')
class D(C,B):pass
test=D()
print(test.name)
test.func()C类name
C类func
Process finished with exit code 0

前面继承类没找到,再去找继承写在后面的父类属性和方法

class A(object):pass
class B(A):name='B类name'def func(self):print('B类func')
class C(A):pass
class D(C,B):pass
test=D()
print(test.name)
test.func()B类name
B类func
Process finished with exit code 0

父类下都没找到属性和方法,再找爷爷类下的属性和方法

class A(object):name='A类name'def func(self):print('A类func')
class B(A):pass
class C(A):pass
class D(C,B):pass
test=D()
print(test.name)
test.func()A类name
A类func
Process finished with exit code 0

4、多重继承时,若子类有构造方法,实例化子类时,会优先自动调用子类构造方法;

class A(object):def __init__(self):print('这个是A类构造函数')pass
class B(A):def __init__(self):print('这个是B类构造函数')pass
class C(A):def __init__(self):print('这个是C类构造函数')pass
class D(C,B):def __init__(self):print('这个是D类构造函数')pass
test=D()这个是D类构造函数
Process finished with exit code 0

若子类没有构造方法,会自动调用写在前面父类的构造方法;再找后面父类的构造方法;

class A(object):def __init__(self):print('这个是A类构造函数')pass
class B(A):def __init__(self):print('这个是B类构造函数')pass
class C(A):def __init__(self):print('这个是C类构造函数')pass
class D(B,C):pass
test=D()"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py
这个是B类构造函数
Process finished with exit code 0

若子类没有构造方法,前面的父类也没有构造方法;会自动调用后面父类的构造方法;

class A(object):def __init__(self):print('这个是A类构造函数')pass
class B(A):pass
class C(A):def __init__(self):print('这个是C类构造函数')pass
class D(B,C):pass
test=D()
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py
这个是C类构造函数Process finished with exit code 0

若子类和父类都没有构造方法,会自动调用爷爷类的构造方法。

class A(object):def __init__(self):print('这个是A类构造函数')pass
class B(A):pass
class C(A):pass
class D(B,C):pass
test=D()
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py
这个是A类构造函数Process finished with exit code 0

5、调用父类,若有构造函数,在实例化子类时就要传相应多的参数,需要多传参数时,就需要重构父类

6、如果在子类需要父类的构造方法就需要显式地调用父类的构造方法,或者重写父类的构造方法。如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__,要继承父类的构造方法,可以使用 super 关键字重写父类构造函数

class Person(object):name='Person类name'age='Person类的age'def __init__(self,name,age):self.name=nameself.age=ageprint(self.name)print('这里是Person类的构造方法')class Teacher(Person):def __init__(self,name,age,sex):super(Teacher,self).__init__(name,age)print('这里是Teacher类的构造方法')self.sex=sextest=Teacher('橙子',11,'男')
print(test.name,test.age,test.sex)橙子
这里是Person类的构造方法
这里是Teacher类的构造方法
橙子 11 男
Process finished with exit code 0

849fc9d6d395e4255620aa4880ee1995.png

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

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

相关文章

数据结构-树1-概念

一、树的性质 一个普通树经过做左孩子右兄弟表示后变为二叉树 二、二叉树性质 完全二叉树判断准则:一棵深度为k的n个结点的二叉树,对树中的结点按从上到下,从左到右的顺序进行编号。如果编号为i的结点和满二叉树中编号为i的结点在二叉树中的…

精益测试

读完需要9分钟速读仅需 3 分钟“你们的测试开发比是多少?测试全阶段参与,怎么可能忙的过来?”“全阶段都在测,那么都需要哪些测试才能保证质量呢?”“自动化测试覆盖率要求达到 99%,包括功能、性能&#xf…

数据结构-树2-二叉树各种函数实现

一、二叉树的递归遍历 二叉树的递归遍历.c #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h>//二叉树的结点 typedef struct BINARYNODE {char ch;struct BINARYNODE *lchild;struct BINARYNODE *rchild; }Binar…

Python反射应用场景(一)

了解了反射中四个函数的基本用法。那么反射到底有什么用呢&#xff1f;它的应用场景是什么呢&#xff1f;答案是&#xff0c;当不确定所需要的属性和函数是否存在时&#xff0c;可以使用反射。另外一个重要作用是&#xff0c;可以提高代码的扩展性和可维护性。假如我们把所有的…

数据结构-树5-二叉搜索树

#include<iostream> #include<string>using namespace std; //构建二叉树的结构体 template< typename T> struct binaryTreeNode {T element; //数据binaryTreeNode<T>* leftChild; //左子树指针binaryTreeNode<T>* rightChild; //右子树指针…

oracle segment undo_71_UNDO扩展学习

UNDO扩展学习UNDO是Oracle在UNDO SEGMENT(回滚段)中记录的信息。下面使用UNDO这名字可能会包含两种意思&#xff0c;一是前面说的回滚段中的记录、二是UNDO整个机制。在这部分内容里&#xff0c;没有涉及闪回技术&#xff0c;要知道不少闪回技术是基于UNDO机制来实现的&#xf…

js判断对象是否为空对象_js对象

七种数据类型 number string bool symbol undefined null object五个Falsy 值 undefined null 0 NaN 对象 object第七种数据类型,唯一一种复杂类型定义无序的数据租户键值对的集合写法let obj {name:frank,age:18}let obj new Object({name:frank})console.log({name:frank,a…

Python字典方法

字典也有方法&#xff0c;很有用&#xff0c;但其使用频率可能没有列表和字符串方法那样高。1、clear 删除所有的字典项d {key: value} d.clear() print(d){}2、copy 方法copy返回一个新字典&#xff0c;其包含的键值对与原来的字典相同&#xff08;这各方法是浅复制&#xff…

交流充电桩电路图_直流充电桩和交流充电桩给电动汽车充电过程中是如何工作的?...

近几年来&#xff0c;新能源汽车发展越来越快&#xff0c;而限制新能源电动汽车发展的主要因素是续航里程和充电问题。续航里程要靠提高电池性能来解决&#xff0c;而解决充电问题就要靠充电桩的普及来实现。下面小编带着大家一起来了解一下直流充电桩和交流充电桩给电动汽车充…

Windows上安装Ubuntu子系统练习linux基本命令

经常在我的群里看到自学测试的小伙伴花费了大量的时间在环境搭建和各种软件的安装上面&#xff0c;有很多就卡在第一步&#xff0c;虚拟机的安装。 有很多安装之后比如启动蓝屏之类的等等&#xff0c;其实&#xff0c;我想说的是&#xff0c;这些都是在走弯路&#xff0c;在这个…

如何巧妙的申请换部门_如何设置户外广告?市城管局局长体验户外广告审批流程...

为巩固拓展“不忘初心、牢记使命”主题教育成果&#xff0c;落实“对标找差、再攀新高”工作要求&#xff0c;优化营商环境&#xff0c;提升服务品质&#xff0c;近日&#xff0c;张家港市城管局局长殷沪飞以个体工商户的身份&#xff0c;到行政审批局城管窗口体验户外广告设置…

安卓APP版本发布流程(一)

一、加固安卓包&#xff08;新版安卓Release包&#xff09;1、下载安装加固软件&#xff0c;注册登录账号https://jiagu.360.cn/#/global/index2、添加签名设置&#xff0c;对应签名路径、密码、别名、别名密码向安卓开发要3、添加签名后&#xff0c;APK加固-添加应用&#xff…

小程序弹出层禁止列表滑动_是时候展现真正的技术了!小程序教程来了——百战Web前端课程更新05.07...

百战程序员十大精品课程&#xff0c;实时更新&#xff0c;保持行业领先。本次更新课程Web前端第二十九阶段安心食疗-微信小程序全部7个章节及课程资料。小程序是依托微信而生的&#xff0c;是一种不用下载就能使用的应用&#xff0c;也是一项创新&#xff0c;经过近几年的发展&…

Jmeter实战(二)|同用户重复并发多次抢红包

之前我们有写过Jmeter多人并发抢1个红包&#xff0c;今天我们来写另外一种场景&#xff0c;同用户重复并发多次抢红包&#xff0c;两种场景还是不太一样&#xff0c;都是比较切合用户实际使用场景&#xff0c;如果1个用户在某些条件下&#xff0c;能重复领取到2次红包&#xff…

【北京上海】七猫内推,高薪海量岗位等你来~

微信长按识别、扫码&#xff0c;查看海量待招岗位&#xff01;&#xff01;&#xff01;UI、产品、测试、开发、运营、数据分析等等