Python关于 继承和多态 的知识(python多类继承)
off999 2024-10-25 13:43 38 浏览 0 评论
面向对象的三大特性:
1. 封装:根据职责将属性和方法封装到一个抽象的类中
2. 继承:子承父类,能实现代码的重用, 相同的代码不需要重复的编写
3. 多态:不同的子类对象调用相同的父类方法, 产生不同的执行结果
目录:继承,多继承,多态
继承的简单介绍:
继承就是为了解决两个有大量重复性代码的类。 # 抽象出一个更抽象的类的公共代码。
# 其意义是重用代码,方便代码的管理与修改
# 类的继承包括属性和方法;继承可以理解为是子承父业继承的格式和__bases__:
class 类名1(类名2):
pass
#类名1继承了类名2的属性和方法,类名2是类名1的父类
#查询父类的魔法方法:__bases__;若没有规定继承的父类,默认继承的父类是object
继承到底继承了什么?
1.继承父类的属性、方法、魔法方法
#dir()可以查看类、实例对象的内置属性和方法
2.继承父类的私有属性,但是不能在子类的方法里直接调用父类的私有属性
3.继承中,属性或方法的寻找顺序:
依托于继承顺序 ---- 首先寻找实例对象本身 ---- 实例类 --- 父类 ---- 。。。。 --- object
#查看继承顺序:
【类名.__mro__】,
或者【实例.__class__.__mro__】;__class__用来查看类名
- 1.继承父类的属性、方法、魔法方法
#dir()可以查看类、实例对象的内置属性和方法
class Father():
sex = '男' #属性
def __init__(self): #魔法方法,注意要在实例化后,实例对象才有hair属性;而类是没有这个属性的
self.hair = '黑色'
def run(self): #方法
print('跑步')
class Son(Father): #Son类继承Father类的sex属性,__init__魔法方法,run方法
pass
#查看Father,Son,xiaoming的内置属性和方法
print(dir(Father))
print(dir(Son))
xiaoming = Son()
print(dir(xiaoming))- 2.继承父类的私有属性,但是不能在子类的方法里直接调用父类的私有属性
class Father():
__sex = '男'
def get(self):
print(self.__sex) #在Father类的方法里调用Father类的私有属性__sex
class Son(Father): #Son继承Father类
def get_from(self):
print(self.__sex) #在Son类的方法里调用Father类的私有属性__sex
a = Father()
a.get()
b = Son()
b.get_from() #在子类方法中不能直接调用父类的私有属性男 #在当前类中可以在方法里调用自己类的私有属性
Traceback (most recent call last):
File "C:/Users/Administrator/Desktop/practice/func[副本].py", line 14, in <module>
b.get_from()
File "C:/Users/Administrator/Desktop/practice/func[副本].py", line 9, in get_from
print(self.__sex)
AttributeError: 'Son' object has no attribute '_Son__sex'
#在子类方法中不能直接调用父类的私有属性
- 3.继承中,属性或方法的寻找顺序:
依托于继承顺序 ---- 首先寻找实例对象本身 ---- 实例类 --- 父类 ---- 。。。。 --- object
class Father():
age = 55
class Son(Father):
age = 24
xiaoming = Son()
xiaoming.age = 12
print(xiaoming.age)
#查看xiaoming实例对象的继承顺序:
print(xiaoming.__class__.__mro__) #或者print(Son.__mro__)12
#在Father类,Son类,xiaoming实例对象都有age属性,但是最终age属性取决于xiaoming这个实例对象继承的顺序
(<class '__main__.Son'>, <class '__main__.Father'>, <class 'object'>)
#属性或方法的继承首先寻找实例对象本身,然后才是按照以上顺序继承,即Son-Father-object
多继承
1.多继承的格式
2.若子类和父类属性同名,依照继承顺序继承,其属性或方法取决于继承顺序
3.属性及方法重构(重写)---通过在子类中定义和父类相同的属性名或方法名来实现,这样就会优先继承子类的属性或方法,覆盖父类的属性或方法
4.重构沿用,定向继承指定类的父类的属性或方法,用super()方法
#super():默认继承当前类的父类(就近原则);
也可以指定继承特定类的父类-----super(指定类, self)
5.super(指定类, self).__init__() ----- 会继承父类初始化里的全部类,而且可以指定父类__init__里的属性调用
- 1.多继承格式的例子
class People():
pass
class Father(People):
pass
class Mother(People):
pass
class Son(Father,Mother):
pass
#Son继承Father,Mother,People类,若Father和Mother类有属性或方法同名,
优先继承Father类,因为Father类在前,谁在前就优先继承谁
print(Son.__mro__) #查询Son类的继承顺序(<class '__main__.Son'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class '__main__.People'>, <class 'object'>)
- 2.若子类和父类属性同名,依照继承顺序继承,其属性或方法取决于继承顺序
class People():
typ = '人类'
class Father(People):
typ = '男人'
class Mother(People):
typ = '女人'
class Son(Father,Mother):
pass
#Son继承Father,Mother,People类,若Father和Mother类有属性或方法同名,
优先继承Father类,因为Father类在前,谁在前就优先继承谁
print(Son.__mro__)
print(Son.typ)(<class '__main__.Son'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class '__main__.People'>, <class 'object'>)
男人 ----继承Father类的typ属性之后,就不会再往后继承
- 3.属性及方法重构(重写)
---通过在子类中定义和父类相同的属性名或方法名来实现,这样就会优先继承子类的属性或方法,覆盖父类的属性或方法
class People():
def __init__(self,typ): #在People类里,使用初始化魔法方法__init__,需要传必备参数typ
self.typ = typ
class Father(People):
typ = '男人'
class Mother(People):
typ = '女人'
class Son(Father,Mother):
def __init__(self):
self.age = 12 #在Son类里,使用初始化魔法方法__init__,不需要传参数
son = Son()
#因为son实例对象优先继承Son类,所以son继承了Son的初始化,不需要传入参数;重构People的初始化方法
若只有People类里有初始化方法,则son在实例化时,必须传入参数,否则会报错
print(son.age)12
- 4.重构沿用,定向继承指定类的父类的属性或方法,用super(指定类, self)方法
class People():
def __init__(self,typ):
self.typ = typ
class Father(People):
typ = '男人'
def run(self):
print('遗传爸爸跑步技能')
class Mother(People):
name = '继承妈妈的姓:李'
def run(self):
print('遗传妈妈跑步技能')
class Son(Father,Mother):
def run(self):
print(super(Son, self).name)
#继承Son类的父类里的name属性,因为Father类没有name,所以再往上一级查找name属性,即继承Mother类的name属性
super(Son, self).run()
#继承Son类的父类(即Father类) 里的run方法
super(Father,self).run()
#继承Father类的父类(即Mother类) 里的run方法
print('孩子跑步')
print(Son.__mro__) #查看继承顺序,方便查看super()方法到底继承哪个类的父类的方法
son = Son(18)
son.run()(<class '__main__.Son'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class '__main__.People'>, <class 'object'>)
继承妈妈的姓:李
遗传爸爸跑步技能
遗传妈妈跑步技能
孩子跑步
- 5.super(指定类, self).__init__() ----- 会继承父类初始化里的全部类,而且可以指定父类__init__里的属性调用
class People():
def __init__(self,typ):
self.typ = typ
self.skin_color = 'yellow'
self.hair_color = 'black'
return self.typ, self.hair_color #返回指定的属性,调用时需用变量接收再打印,或者print输出
class Father(People):
def run(self):
print('遗传爸爸跑步技能')
class Mother(People):
name = '继承妈妈的姓:李'
def run(self):
print('遗传妈妈跑步技能')
class Son(Father,Mother):
def __init__(self):
self.jicheng = super(Son, self).__init__('孩子')
#在Son类的初始化方法里,创建新的属性名来继承(接收)它父类中的初始化方法,即People类里的,
在People类的__init__必须传一个参数
#调用指定属性:不需要在super()后指定属性名调用所需属性,只需在实例化调用时,
使用和父类中初始化的属性名相同的属性名就可以调用,即【子类实例对象.父类中的属性名】
self.age = 10
#Son类自己的初始化属性
#实例化调用
son = Son()
print(dir(son)) #继承了Father,Mother,People里的属性,方法,初始化魔法方法
print(son.jicheng)
#用新的属性名jicheng,接收了People__init__里的return的值,若return多个属性,则以元组的形式输出
print(son.typ) #调用和父类中初始化属性名一样的typ
print(son.skin_color) #调用和父类中初始化属性名一样的skin_color
print(son.hair_color) #调用和父类中初始化属性名一样的hair_color
print(son.age)['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'hair_color', 'jicheng', 'name', 'run', 'skin_color', 'typ']
('孩子', 'black') ----- son.jicheng
孩子 ----son.typ
yellow --- son.skin_color
black ---- son.hair_color
10 ---- son.age
多态
定义:不同的子类对象调用相同的父类方法, 产生不同的执行结果
多态的两个前提:
1.继承;
2.重写父类方法:子类继承父类方法,当子类里有和父类同名的方法,则子类里的方法会覆盖父类同名的方法
多态的好处:可以增加代码的灵活度调用Dog类(父类)的game方法
class Dog(object): #父类
def __init__(self, name):
self.name = name
def game(self):
print('%s在玩耍...' % self.name)
class Sq(Dog): #子类,继承Dog类的name属性和game方法
def game(self): #重写父类的game方法,并覆盖Dog类的game方法
print('%s飞到天上去玩耍...' % self.name)
class Person(object):
def __init__(self, name):
self.name = name
def game_with_dog(self, dog):
print('%s和%s快乐的玩耍....' % (self.name, dog.name))
dog.game()
#调用game方法,取Dog类还是Sq类的game方法,取决于Person实例对象xm传入的参数
jm = Dog('金毛')
xm = Person('小明')
xm.game_with_dog(jm)
#xm实例对象传入的参数属于Dog类,所以调用的是Dog类里的game方法和Dog类里的name属性小明和金毛快乐的玩耍....
金毛在玩耍...
调用Sq类(子类)的game方法
class Dog(object): #父类
def __init__(self, name):
self.name = name
def game(self):
print('%s在玩耍...' % self.name)
class Sq(Dog): #子类,继承Dog类的name属性和game方法
def game(self): #重写父类的game方法,并覆盖Dog类的game方法
print('%s飞到天上去玩耍...' % self.name)
class Person(object):
def __init__(self, name):
self.name = name
def game_with_dog(self, dog):
print('%s和%s快乐的玩耍....' % (self.name, dog.name))
dog.game()
#调用game方法,取Dog类还是Sq类的game方法,取决于Person实例对象xm传入的参数
jm = Sq('神犬')
xm = Person('小明')
xm.game_with_dog(jm)
#xm实例对象传入的参数属于Sq类,所以调用的是Sq类里的game方法和Sq类里的name属性小明和神犬快乐的玩耍....
神犬飞到天上去玩耍...
相关推荐
- 惠普电脑序列号查询官网(惠普笔记本序列号查询官网)
-
您可以按照以下步骤在惠普官网上查询笔记本序列号:1.打开惠普官网,点击页面右上角的“支持”选项,进入支持页面。2.在支持页面上,键入您的笔记本型号或选择产品类别和型号。3.找到您的笔记本型号后,...
- 超级硬盘数据恢复软件下载(超级硬盘数据恢复软件破解)
-
DiskGenius不算是最好的恢复软件,恢复软件有四款:EasyRecovery一款,PandoraRecovery一款,Recuva一款,还有就是你说的DiskGenius这一款,在这四款恢复软件...
- win10激活需要联网吗(win10系统激活需要联网吗)
-
下载激活工具需要,如果有激活工具的话直接激活就可以了。不一定win10激活分两种:一种是kms激活不需要联网(一般用于企业环境)一种是激活码,必须联网环境才能激活。kms激活方法:1、按win+R键,...
- 如何恢复手机上的所有的数据
-
手机全部清除数据后恢复方法是直接在手机上下载相关的恢复软件,可以直接对手机的机身内存进行扫描,会自动识别被删除的文件,通过软件就可以恢复。发生数据误删除情况也不必惊慌,用恢复工具就可以找回。以顶尖数据...
- win10蓝屏代码大全及解决方案
-
1.蓝屏大多都是因驱动问题导致,安全模式启动环境只会加载一些必要的系统文件和驱动,可排除第三方软件或驱动的影响。 2.进入安全模式,如果在安全模式下没有再出现蓝屏或无限重启的问题,那么基本上可以判断...
- 如何查看电脑内存条型号(电脑卡换内存条有用吗)
-
查看电脑内存条型号方法步骤,方法一:1、按下键盘组合键“Win+R”打开运行。2、接着在运行输入“cmd”点击“确定”3、然后在其中输入“wmic”回车后再输入“memorychip”回车运行。4、运...
- windows7旗舰版密钥最新(win7系统旗舰版密钥)
-
激活密钥分为MAK密钥、OEM密钥、VOL密钥、RETAIL密钥、KMS密钥:1.MAK,是MultipleActivationKey的简称,这种开放式许可KEY允许多次激活。该激活是永久性的,意...
- win7定时开关机(win7电脑设置定时开关机)
-
要在Windows7上设置每天自动开关机,您可以按照以下步骤操作:1.打开“控制面板”,单击“系统和安全”,然后选择“计划任务”。2.单击“创建基本任务”,输入一个适合您的任务名称,并添加相应的...
- windows7笔记本系统下载(笔记本电脑怎么下载windows7)
-
1.打开浏览器,前往Minecraft官网(https://www.minecraft.net/)。2.点击“获取Minecraft”按钮。3.选择“计算机”选项卡,并选择“Windows”操作...
- 打印机有任务却打不出来(打印机有任务但是状态无内容)
-
首先要看打印机是否支持无线打印功能。若是支持,先打开打印机的无线WIFI热点,一般打开后打印机屏幕会显示出热点名及密码。打开手机无线,搜索热点,输入密码后连接上打印机。找到需要打印的资料,选择打印,选...
- windows11最新版本号是多少(windows11最新正式版本号)
-
Windows11可以使用WPS,WPS作为一款软件,最基础的条件就是适应不同新系统以及做出优化,对于win11,它们当然会第一时间跟进系统更新作出的改变,对于大型系统升级,一定是会提前进行演练的,排...
- 软件商店电脑版官方下载(电脑软件商店app)
-
为什么笔记本电脑上面自带的软件商店不能下载东西,如果你遇到这种情况,首先你要检查一下你的笔记本电脑是不是连接wifi或者是无线网,过你的笔记本电脑没有连接网络,或者是断开了网络连接这样。就会出现下载不...
- win7系统激活码永久方法(win7系统激活码多少钱)
-
win7升级win10后系统已经是激活状态,不需要再激活。激活方法如下:1、首先注册微软账号(点此注册)。2、填写好相关信息后,点击“创建账户”。3、点击“入门”后,当前已登录的微软账号将自动加入计划...
- win7需要什么硬件配置(win7需要什么硬件配置好)
-
WIN7系统对电脑得配置要求:WIN732位系统硬件配置要求:1、CPU:1GHz32位2、内存:1GB及以上内存3、硬盘空间:16GB以上的硬盘,最好保证那个分区有20GB的空间。4、显卡:6...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
