继承与多继承的查找顺序
2021/12/7 6:17:07
本文主要是介绍继承与多继承的查找顺序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- 一:继承
- 二:类的继承
- 1.不使用继承之前:如下
- 三,单继承下属性查找
- 四:继承与抽象
- 五,多继承的继承应用
- 六,多继承下的属性查找
- 1.新式类:按照广度优先查询
- 2.经典类:按照深度优先
一:继承
1.什么是继承? 继承是新建类的一种方式 新建的类我们称之为子类或者叫派生类 被继承的类我们称之为父类或者基类 子类可以使用父类中的属性或者方法
2.为什么要用继承? 类解决了对象与对象之间的代码冗余问题 继承解决的是类与类之间的代码冗余问题
3.如何使用继承? 新式类: 继承了object类的子子孙孙类都是新式类 经典类: 没有继承了object类的子子孙孙类都是经典类 新式类和经典类只有在python2中区分 因而在Python3中统一都是新式类
二:类的继承
1.不使用继承之前:如下
不使用继承 class Animal: def run(self): print('走路') def eat(self): print('吃饭') class Dog: def run(self): print('走路') def eat(self): print('吃饭') def speak(self): print('汪汪叫') class Person: def run(self): print('走路') def eat(self): print('吃饭') def work(self): print('上班') 这样人和狗都有共同的特性 走路和吃饭 就有重复的特性 使得代码冗余 这样就可以使用继承来解决这个问题
继承的特性是:子类会遗传父类的属性和方法 继承是类与类之间的关系
使用继承: Dog子类Person子类都继承Animal父类 class Animal: # 它作为父类 head = 1 def run(self): print('走路') def eat(self): print('吃饭') # 子类会遗传父类的属性和方法 class Dog(Animal): # 它做为子类 def speak(self): print('汪汪叫') # 子类会遗传父类的属性和方法 class Person(Animal): # 它做为子类 def work(self): print('工作') dog = Dog() dog.eat() # 打印结果: 吃饭 print(dog.head) # 打印结果: 1
三,单继承下属性查找
单继承下属性查找: 查询顺序:先从对象名称空间中查找--》产生对象的类名称空间查找--》继承的父类中查找 class Foo: def f1(self): print('Foo.f1') def f2(self): print('Foo.f2') self.f1() def Bar(Foo): def f1(self): print('Bar.f1') obj = Bar() obj.f2() 输出结果: Foo.f2 Bar.f1
1.单继承:进阶版
class Foo: def __f1(self): _Foo__f1() print('Foo.f1') def f2(self): print('Foo.f2') self.__f1() _Foo__f1() class Bar(Foo): def __f1(self): _Bar__f1() print('Bar.f1') obj = Bar() {} obj.f2() 结果 Foo.f2 Bar.f1
四:继承与抽象
要找出类与类之间的继承关系,需要先抽象,再继承。抽象即总结相似之处,总结对象之间的相似之处得到类,总结类与类之间的相似之处就可以得到父类,如下图所示
基于抽象的结果,我们就找到了继承关系
基于上图我们可以看出类与类之间的继承指的是什么’是’什么的关系(比如人类,猪类,猴类都是动物类)。子类可以继承/遗传父类所有的属性,因而继承可以用来解决类与类之间的代码重用性问题。
五,多继承的继承应用
多继承的基础应用 class Animal(): 括号什么都没有 表示没有继承 class Animal: def run(self): print('走路') class Coder: def work(self): print('写代码') class Person(Animal, Coder): 可以多继承 类的属性和方法 def eat(self): print('吃饭') p=Person() p.run() 输出结果走路 p.run() 输出结果:走路 p.run() 输出结果:走路
六,多继承下的属性查找
新式类:按照广度优先查询 经典类:按照深度优先查询 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B') pass class C(A): def test(self): print('from C') pass class D(B): def test(self): print('from D') pass class E(C): def test(self): print('from E') pass class F(D, E): 多继承 按照从左往右查找 def test(self): print('from F') pass f1 = F() f1.test()
1.新式类:按照广度优先查询
新式类 ''' 如果一个类继承了object,这个类就是新式类 python3中,所有类都默认继承了object(不写也会继承object类),所以所有类都是新式类 ''' 学生 class Student(object): pass 教师 class Teacher: pass 学校 class School(Student, Teacher): pass 查看一个类,继承了哪些父类 print(School.__bases__) print(Teacher.__bases__) print(School.__bases__)
2.经典类:按照深度优先
经典类 没有继承任何父类的 就叫经典类 只有python2中才有 python2中如果要写新式类,需要手动继承object # 如果在python2中 class Student(object): # 新式类 pass class Teacher(): # 经典类 pass python2中的语法 print Student.__bases__ # (<type 'object'>,) print Teacher.__bases__ # () 新式类和经典类的属性查找顺序是不一样的
这篇关于继承与多继承的查找顺序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-02Java管理系统项目实战入门教程
- 2024-11-02Java监控系统项目实战教程
- 2024-11-02Java就业项目项目实战:从入门到初级工程师的必备技能
- 2024-11-02Java全端项目实战入门教程
- 2024-11-02Java全栈项目实战:从入门到初级应用
- 2024-11-02Java日志系统项目实战:初学者完全指南
- 2024-11-02Java微服务系统项目实战入门教程
- 2024-11-02Java微服务项目实战:新手入门指南
- 2024-11-02Java项目实战:新手入门教程
- 2024-11-02Java小程序项目实战:从入门到简单应用