继承与多继承的查找顺序

一:继承

1.什么是继承?
继承是新建类的一种方式
	新建的类我们称之为子类或者叫派生类
		被继承的类我们称之为父类或者基类
        	子类可以使用父类中的属性或者方法

image

2.为什么要用继承?
 类解决了对象与对象之间的代码冗余问题
 继承解决的是类与类之间的代码冗余问题
3.如何使用继承?
 新式类: 继承了object类的子子孙孙类都是新式类
 经典类: 没有继承了object类的子子孙孙类都是经典类
    
    新式类和经典类只有在python2中区分
    因而在Python3中统一都是新式类

image

二:类的继承

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

image

三,单继承下属性查找

单继承下属性查找:
查询顺序:先从对象名称空间中查找--》产生对象的类名称空间查找--》继承的父类中查找

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

四:继承与抽象

要找出类与类之间的继承关系,需要先抽象,再继承。抽象即总结相似之处,总结对象之间的相似之处得到类,总结类与类之间的相似之处就可以得到父类,如下图所示

image

基于抽象的结果,我们就找到了继承关系

image

基于上图我们可以看出类与类之间的继承指的是什么’是’什么的关系(比如人类,猪类,猴类都是动物类)。子类可以继承/遗传父类所有的属性,因而继承可以用来解决类与类之间的代码重用性问题。

五,多继承的继承应用

 多继承的基础应用

 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.新式类:按照广度优先查询

image

新式类
'''
如果一个类继承了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__  # ()


新式类和经典类的属性查找顺序是不一样的

image

posted @ 2021-12-07 00:41  AlexEvans  阅读(65)  评论(0编辑  收藏  举报