深度优先&广度优先(多继承)

Python支持多父类的继承机制,所以需要注意圆括号中基类的顺序,若是基类中有相同的方法名,并且在子类使用时未指定,Python会从左至右搜索基类中是否包含该方法。一旦查找到则直接调用,后面不再继续查找。

# 父类定义
class people:

    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.__weight = weight

    def speak(self):
        print("%s 说: 我 %d 岁。" % (self.name, self.age))

# 单继承示例
class student(people):

    def __init__(self, name, age, weight, grade):
        # 调用父类的实例化方法
        people.__init__(self, name, age, weight)
        self.grade = grade

    # 重写父类的speak方法
    def speak(self):
        print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))

s = student(‘ken‘, 10, 30, 3)
s.speak()

Python3的继承机制

Python3的继承机制不同于Python2。其核心原则是下面两条,请谨记!

  • 子类在调用某个方法或变量的时候,首先在自己内部查找,如果没有找到,则开始根据继承机制在父类里查找。
  • 根据父类定义中的顺序,以深度优先的方式逐一查找父类!

例一:

设想有下面的继承关系:

class D:
    pass

class C(D):
    pass

class B(C):
    def show(self):
        print("i am B")
    pass

class G:
    pass

class F(G):
    pass

class E(F):
    def show(self):
        print("i am E")
    pass

class A(B, E):
    pass

a = A()
a.show()

运行结果是"i am B"。在类A中,没有show()这个方法,于是它只能去它的父类里查找,它首先在B类中找,结果找到了,于是直接执行B类的show()方法。可见,在A的定义中,继承参数的书写有先后顺序,写在前面的被优先继承。

那如果B没有show方法,而是D有呢?

class D:
    def show(self):
        print("i am D")
    pass

class C(D):
    pass

class B(C):

    pass

class G:
    pass

class F(G):
    pass

class E(F):
    def show(self):
        print("i am E")
    pass

class A(B, E):
    pass

a = A()
a.show()

执行结果是"i am D",左边具有深度优先权,当一条路走到黑也没找到的时候,才换另一条路。可见,在这种继承结构关系中,搜索顺序是这样的:

例二:

那如果继承结构是这样的呢?类D和类G又同时继承了类H。当只有B和E有show方法的时候,无疑和上面的例子一样,找到B就不找了,直接打印"i am B"。但如果是只有H和E有show方法呢?

class H:
    def show(self):
        print("i am H")
    pass

class D(H):
    pass

class C(D):
    pass

class B(C):
    pass

class G(H):
    pass

class F(G):
    pass

class E(F):
    def show(self):
        print("i am E")
    pass

class A(B, E):
    pass

a = A()
a.show()

我们想当然地以为会打印"i am H",因为深度优先嘛。但是,打印的却是"i am E"!为什么?因为在这种情况下,Python的搜索路径是这样的:

那可能有人会问,别的继承情况呢?这两种继承图太简单了,不能代表所有!实际上其它的继承模式,仔细一解剖,都能划分成上面两种情况,比如下面的例子(箭头代表继承关系),B同时继承了C和F:

class D():
    pass

class G():
    def show(self):
        print("i am G")
    pass

class F(G):
    pass

class C(D):
    pass

class B(C,F):
    pass

class E(F):
    def show(self):
        print("i am E")
    pass

class A(B, E):
    pass

我们用图形来分析它,就是下面的样子:

原文地址:https://www.cnblogs.com/xiaohei001/p/9787438.html

时间: 2024-10-30 03:44:00

深度优先&广度优先(多继承)的相关文章

深度优先广度优先

深度优先:纵向 广度优先:横向 

【leetcode-200 深度优先+广度优先】 岛屿数量

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入:11110110101100000000 输出: 1示例 2: 输入:11000110000010000011 输出: 3 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/number-of-islands 方法一:深度优先搜索 [通过]直觉 将

数据结构之深度优先,广度优先遍历

深度优先和广度优先遍历在树和图中应用最为普遍,思想也类似,因此放到一起来总结. 二叉树的深度优先广度优先遍历: 一棵二叉树(2,(2(3,4),3(4,5))),这是一棵满二叉树,一共有7个节点,根节点2,深度为3 数据结构定义如下: class Node: def __init__(self, value=None, left = None, right = None): self.value = value self.left = left self.right = right 先根遍历 d

Python基础(17)_面向对象程序设计(抽象类、继承原理、封装、多态,绑定方法)

一.抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 1.在python中实现抽象类 import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta): all_type='file' @abc.abstractmethod #定义抽象方法,无需实现功能 def read(self): '子类必须定义读功能' pass @abc.abstractmethod #定义抽象方法,无需实现功能 def write(sel

面对对象之继承 | Python

1.Son继承Parent这个基类,可以直接调用基类中的方法, 但是,如果要在子类中__init__()方法下添加新属性, 需要主动调用基类的__init__()方法,因为,子类不会 自动调用基类的__init__()方法. class Son(Parent): def __init__(self,name): Parent.__init__(self) self.name = 'Mic' def run(self): pass 2.在基类方法之上,再添加一些操作: class Son(Pare

Python学习-类的继承

1 继承: 2 #python2 经典类是按深度优先来继承的,新式类是按广度优先来继承的 3 #python3 经典类和新式类都是按广度优先来继承的 4 5 6 7 #经典类:class People: 8 class People(object): #这个是新式类,多继承的时候有了改变 9 10 def __init__(self, name, age): 11 self.name =name 12 self.age = age 13 14 15 def eat(self): 16 print

python面向对象(类的继承)

一. 继承的初识 在python3中 所有的类都继承自object class ParentClass1: pass class ParentClass2: pass class ChildClass(ParentClass1):pass #单继承 class ChildClass1(ParentClass1,ParentClass2):pass #多继承 print(ParentClass1.__base__) print(ChildClass.__base__) #会显示该类的一个父类 pr

Python面向对象特性 - 继承

面向对象有3大特性:继承.多态.封装,本章介绍 Python中的 继承 特性~? 什么是继承 继承是创建类的一种方式,在 Python中支持多继承,即在创建类的时候可以继承一个或者多个父类.在继承关系中,被继承的类通常称为父类(或超类,基类),新建的类则称为子类(或派生类).?继承的优势在于可以有效地重用代码,提高代码的可读性~?继承示例: class Fu_1: # 父类 pass class Fu_2: # 父类 pass class Zi_1(Fu_1): # 单继承 pass class

类 与 继承

什么是继承 为什么需要继承 存在继承后的属性查找顺序 派生 在子类重用父类方法 经典类与新式类 菱形继承的问题 mro列表 1.什么是继承 继承是一种关系,通过继承关系,一个对象可以直接使用另一个对象拥有的内容,例如王思聪继承王建林,王思聪就可以使用王健林拥有的财产! 被继承的一方称之为父,即王健林; 继承的一方称之为子,即王思聪 OOP继承描述的是两个类之间的关系,通过继承,一个类可以直接使用另一个类中已定义的方法和属性; 被继承的称之为父类或基类,继承父类的类称之为子类; 在python3中