继承和多态-面向对象-python
2021/12/27 20:11:29
本文主要是介绍继承和多态-面向对象-python,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、继承
继承是一种创建新类的方式,新建的类可称为子类或派生类,父类又可称为基类或超类,子类会遗传父类的属性。
-
格式
class 子类(父类): pass
-
特点
- 在继承中,基类的构造方法(_init_()方法)不会自动调用,需要在子类的构造方法中显示调用
- 在调用基类的方法时需要加上基类的类名前缀,并带上 self 参数变量。区别于在类中调用普通函数时不需要带 self 参数。
- 在 Python 中,首先查找对应类型的方法,如果在子类中找不到对应的方法,才到基类中逐个查找。
- 子类获得了父类全部非私有的功能。
- 子类不能继承父类中的私有方法,也不能被调用父类的私有方法。
- 对于父类中扩展的非私有方法,子类可以拿来即用。
-
示例:
class People: def __init__(self, name, age): self.__name = name self.__age = age def run(self): print('{}正在跑步'.format(self.__name)) class Student(People): def __init__(self, name, age, classroom): super().__init__(name, age) self.__classroom = classmethod s = Student('小明', 15, '高一2班') s.run()
2、多继承
-
优点:子类可以同时遗传多个父类的属性,最大限度地重用代码
-
缺点:
- 违背人的思维习惯:继承表达的是一种什么"是"什么的关系
- 代码可读性会变差
- 不建议使用多继承,有可能会引发可恶的菱形问题,扩展性变差
-
如果多继承是菱形继承,经典类与新式类的属性或者方法查找顺序不一样:
- 新式类:广度优先,会在检索最后一条分支的时候检索大脑袋
-
示例:继承关系[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCMNKzxk-1640602466859)(I:\study\python\oob\oob-multi-inherit.drawio.png)]
class A: def test(self): print('from A') class B(A): def test(self): print('from B') class C(A): def test(self): print('from C') class D(B, C): pass d = D() d.test()
3、多态
在python中没有方法重载,只有重写(覆盖),即子类方法和父类同名的方法。
-
作用
- 让具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容(功能)的函数。
-
特点:
- 只关心对象的实例方法是否同名,不关心对象所属的类型;
- 对象所属的类之间,继承关系可有可无;
- 多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;
- 多态是调用方法的技巧,不会影响到类的内部设计。
-
场景
-
对象所属的类之间没有继承关系
class Duck(object): # 鸭子类 def fly(self): print("鸭子沿着地面飞起来了") class Swan(object): # 天鹅类 def fly(self): print("天鹅在空中翱翔") class Plane(object): # 飞机类 def fly(self): print("飞机隆隆地起飞了") def fly(obj): # 实现飞的功能函数 obj.fly() duck = Duck() fly(duck) swan = Swan() fly(swan) plane = Plane() fly(plane) ===运行结果:=================================================================================== 鸭子沿着地面飞起来了 天鹅在空中翱翔 飞机隆隆地起飞了
-
对象所属的类之间有继承关系(应用更广)
class gradapa(object): def __init__(self,money): self.money = money def p(self): print("this is gradapa") class father(gradapa): def __init__(self,money,job): super().__init__(money) self.job = job def p(self): print("this is father,我重写了父类的方法") class mother(gradapa): def __init__(self, money, job): super().__init__(money) self.job = job def p(self): print("this is mother,我重写了父类的方法") return 100 #定义一个函数,函数调用类中的p()方法 def fc(obj): obj.p() gradapa1 = gradapa(3000) father1 = father(2000,"工人") mother1 = mother(1000,"老师") fc(gradapa1) #这里的多态性体现是向同一个函数,传递不同参数后,可以实现不同功能. fc(father1) print(fc(mother1)) ===运行结果:=================================================================================== this is gradapa this is father,我重写了父类的方法 this is mother,我重写了父类的方法 100
-
参考文章:
- Python——继承
- Python中的多态如何理解?
参考视频:https://www.bilibili.com/video/BV1R7411F7JV 239~247
源代码仓库:https://gitee.com/gaogzhen/python-study
这篇关于继承和多态-面向对象-python的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-02Python编程基础
- 2024-11-01Python 基础教程
- 2024-11-01用Python探索可解与不可解方程的问题
- 2024-11-01Python编程入门指南
- 2024-11-01Python编程基础知识
- 2024-11-01Python编程基础
- 2024-10-31Python基础入门:理解变量与数据类型
- 2024-10-30Python股票自动化交易资料详解与实战指南
- 2024-10-30Python入行:新手必读的Python编程入门指南
- 2024-10-30Python入行:初学者必备的编程指南