Python关于 继承和多态 的知识(python多类继承)
off999 2024-10-25 13:43 56 浏览 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属性小明和神犬快乐的玩耍....
神犬飞到天上去玩耍...
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- 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)
