zoukankan      html  css  js  c++  java
  • Python学习之路_day_24(面向对象之继承)

    面向对象之继承:

    1. 继承介绍

    什么是继承:

    继承是一种创建新类的方式,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。

    子类会“”遗传”父类的属性,从而解决代码重用问题。

    继承的特性:子类可以遗传和重用父类的属性。

    python中的类分为两种:新式类,经典类

    新式类: 但凡继承了object的类Foo,以及该类的子类...都是新式类。

    在python3中一个类即便是没有显式地继承任何类,默认就会继承object,即python3中所有的类都是新式类。

    经典类:没有继承object的类,以及该类的子类...都是经典类

    在python2中才区分新式类与经典类,在python2中一个类如果没有显式地继承任何类,也不会继承object。

    提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

    1. 继承与抽象

    继承描述的是子类与父类之间的关系,是一种什么是什么的关系。要找出这种关系,必须先抽象再继承。

    继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。

    抽象只是分析和设计的过程中,一个动作或者说一种技巧,通过抽象可以得到类。

    1. 继承与重用

     在开发程序的过程中,如果我们定义了一个类A,然后又想新建立另外一个类B,但是类B的大部分内容与类A的相同时。

    我们不可能从头开始写一个类B,这就用到了类的继承的概念。

    通过继承的方式新建类B,让B继承A,B会‘遗传’A的所有属性(数据属性和函数属性),实现代码重用。

    1. 属性查找优先级

    在单继承背景下属性的查找优先级:对象->对象的类->父类->父类.....

    在多继承背景下属性的查找优先级:

    如果一个子类继承多个分支(多个分支没有共同继承一个非object的类)

    此时属性的查找优先级是:对象->对象的类->按照从左往右的顺序一个分支一个分支的找下去。

    菱形继承问题:

    新式类 : 广度优先查找,从左往右一个分支一个分支的查找,在最后一个分支才去查找顶级类

    经典类 : 深度优先查找,从左往右一个分支一个分支的查找,在第一个分支就查找顶级类

    新式类(广度优先)

    经典类(深度优先)

    1. 在子类派生出的新方法中重用父类功能

    方式一:即父类名.父类方法()

    指名道姓地引用某一个类中的函数

    总结:

    1. 与继承无关

    2. 访问是类的函数,没有自动传值的效果

    方式二:super()

    super()必须在类中用

    在python2中:super(自己的类名,自己的对象)

    在python3中:super()

    调用该函数会得到一个特殊的对象,该对象专门用来访问父类中的属性,!!!完全参照mro列表!!!!

    总结:

    1. 严格依赖继承的mro列表

    2. 访问是绑定方法,有自动传值的效果

    6.继承原理(python如何实现的继承)

    python到底是如何实现继承的,对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表,例如

    >>> F.mro() #等同于F.__mro__

    [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

     

    为了实现继承,python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。
    而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则:
    1.子类会先于父类被检查
    2.多个父类会根据它们在列表中的顺序被检查
    3.如果对下一个类存在两个合法的选择,选择第一个父类

     

     

     

     

     

  • 相关阅读:
    分享关于Entity Framework 进行CRUD操作实验的结果
    总结Unity IOC容器通过配置实现类型映射的几种基本使用方法
    Python深入:Distutils发布Python模块--转载
    原创:R包制作--windows
    提高R语言速度--转载
    R 语言 Windows 环境 安装与Windows下制作R的package--Rtools
    极简 R 包建立方法--转载
    R的极客理想系列文章--转载
    如何创建R包并将其发布在 CRAN / GitHub 上--转载
    教你如何成为数据科学家(六)
  • 原文地址:https://www.cnblogs.com/zjh009/p/9505985.html
Copyright © 2011-2022 走看看