Python面向对象03 /继承

1. 初识继承

  • 概念:专业角度:如果B类继承A类,B类就称为子类,派生类,A类就称为父类,超类,基类
  • 种类:单继承,多继承
  • 面向对象的三大特征:继承,封装,多态
  • 继承的优点:
    1. 减少重复的代码
    2. 增加类之间的耦合性(不宜多,宜精)
    3. 使代码更清晰,合理化

2. 单继承

  • 定义:只有一个父类

  • 执行父类的属性和方法:

    1.类名执行父类的属性和方法

    2.派生类对象执行父类的属性和方法

    ​ 1.查询顺序:

    ​ 单向不可逆,子类可以使用父类的属性和方法,父类不可以使用子类的属性和方法

    ​ 2.实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找。

  • 既要执行子类的方法,又要执行父类的方法

    方法一:不依赖继承 / 父类.func(对象,其他参数)

    class Animal(object):
    type_name = "动物类"
    def __init__(self,name,sex,age):
    self.name = name
    self.age = age
    self.sex = sex
    def eat(self):
    print("吃东西")
    class Person(Animal):
    def __init__(self,name,sex,age,mind):
    Animal.__init__(self,name,sex,age)
    self.mind = mind
    def eat(self):
    super().eat()
    print(f'{self.name}会吃饭') p1 = Person("张三","男",18,"有思想")
    p1.eat()

    方法二:依赖继承 / 利用super

    class Aniaml(object):
    type_name = '动物类'
    def __init__(self,name,sex,age):
    self.name = name
    self.age = age
    self.sex = sex
    def eat(self):
    print('吃东西')
    class Person(Aniaml):
    def __init__(self,name,sex,age,mind):
    {super(Person,self).__init__(name,sex,age)} (完整写法)
    super().__init__(name,sex,age)
    self.mind = mind
    def eat(self):
    super().eat()
    print('%s 吃饭'%self.name)
    class Cat(Aniaml):
    pass
    p1 = Person('张三','男',18,'有思想')
    print(p1.__dict__) # 利用super,super().func(参数)
    # super.__init__执行父类
    # 执行父类的__init__方法,重构父类方法.

    单继承应用示例:

    class Base:
    def __init__(self,num):
    self.num = num
    def func1(self):
    print(self.num)
    self.func2()
    def func2(self):
    print(222,self.num)
    class Foo(Base):
    def func2(self):
    print(222,self.num)
    lst = [Base(1),Base(2),Foo(3)]
    for obj in lst:
    obj.func1() # 结果:
    1
    222 1
    2
    222 2
    3
    222 3
  • 单继承总结:

    1. 面向对象中super的作用:

    ​ super().func(参数) 重构父类的方法,严格按照对象从属类的mro顺序执行

3. 多继承

  • Python类分为两种:

    经典类:不继承object类,深度优先原则,深度优先.从左至右,深度优先.

    新式类:继承object类,mro(C3)算法(新式类查询顺序)

  • Python2x:Python2.2之前都是经典类,Python2.2之后,经典类和新式类共存

    Python3x:全都是新式类,如果基类谁都不继承,那这个类会默认继承object类

  • 新式类推导示例:

    class O:
    name = '张三' class D(O):
    pass class E(O):
    name = '李四'
    # pass
    class F(O):
    name = '王五' class B(D,E):
    pass class C(E,F):
    pass class A(B,C):
    pass obj = A()
    print(obj.name) # mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
    # mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C]) '''
    mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C]) mro(B(D,E)) = [B] + merge(mro(D),mro(E),[D,E]) mro(B(D,E)) = [B] + merge([D,O],[E,O],[D,E])
    mro(B(D,E)) = [B,D] + merge([O],[E,O],[E])
    mro(B(D,E)) = [B,D,E] + merge([O],[O])
    mro(B(D,E)) = [B,D,E,O] mro(C) = [C,E,F,O] mro(A(B,C)) = [A] + merge([B,D,E,O],[C,E,F,O],[B,C])
    = [A,B] + merge([D,E,O],[C,E,F,O],[C])
    = [A,B,D] + merge([E,O],[C,E,F,O],[C])
    = [A,B,D,C] + merge([E,O],[E,F,O])
    = [A,B,D,C,E] + merge([O],[F,O])
    = [A,B,D,C,E,F,O]
    ''' # print(A.mro())
  • 经典类推导示例:见下面示例

4. 总结

  1. 类的静态属性,如果指向一个可变数据类型,对象或者类名都可以给这个可变数据类型内部增,删,改,查(不可以对其整体增,删,改,查)

    示例代码:

    class A:
    name = []
    p1 = A()
    p2 = A()
    p1.name.append(1)
    # p1.name,p2.name,A.name 分别是什么?
    # 结果:[1],[1],[1]
  2. 新式类,经典类示例

    class A:
    pass
    class B(A):
    pass
    class C(A):
    pass
    class D(A):
    pass
    class E(B, C):
    pass
    class F(C, D):
    pass
    class G(D):
    pass
    class H(E, F):
    pass
    class I(F, G):
    pass
    class K(H, I):
    pass
    # 如果这是经典类,请写出他的继承顺序。
    KHEBACFDIG # 如果这是新式类,请写出他的继承顺序,并写出具体过程。
    KHEBIFCGDA

Python面向对象03 /继承的更多相关文章

  1. python进阶03 继承

    python进阶03 继承 一.继承 课堂练习:假设你正在参与一个魔幻类角色游戏的开发,公司需要腻味这个游戏设计两个角色的类: a.剑士 属性:1.角色名:2.角色等级:3.生命值:4.攻击力 行为: ...

  2. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  3. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  4. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  5. python面向对象编程 继承 组合 接口和抽象类

    1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...

  6. python面向对象的继承-组合-02

    *面向对象(OOP)的三大特征:**# 封装.继承.多态 继承 什么是继承 继承:# 是一种关系,描述两个对象之间什么是什么的什么的关系 例如:麦兜.佩奇.猪猪侠.猪刚鬣,都是猪 为什么要使用继承 继 ...

  7. python 面向对象之继承与派生

    一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...

  8. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

  9. python面向对象之继承与派生

    一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...

随机推荐

  1. pip安装mysql-connector

    pip install mysql-connector --index-url https://pypi.douban.com/simple

  2. JavaSE之流程控制结构

    流程控制语句结构 一.顺序结构 public static void main(String[] args){     //顺序执行,根据编写的顺序,从上到下运行     System.out.pri ...

  3. STM32单片机应用与全案例实践 /stm32自学笔记 第二版 pdf

    STM32单片机应用与全案例实践pdf https://pan.baidu.com/s/16WrivuLcHvLTwS__Zcwl6Q 4rj3 stm32自学笔记 第二版 pdf https://p ...

  4. 一文搞定Redis五大数据类型及应用场景

    本文学习知识点 redis五大数据类型数据类型:string.hash.list.set.sorted_set 五大类型各自的应用场景 @TOC 1. string类型 1-1 string类型数据的 ...

  5. 使用SpringCloud Stream结合rabbitMQ实现消息消费失败重发机制

    前言:实际项目中经常遇到消息消费失败了,要进行消息的重发.比如支付消息消费失败后,要分不同时间段进行N次的消息重发提醒. 本文模拟场景 当金额少于100时,消息消费成功 当金额大于100,小于200时 ...

  6. 也来聊聊 HTTPS.

    前言: 网上聊 HTTPS 的文章已经数都数不过来了吧,厚着脸皮,整理下读书笔记,结合平常项目的实践,也来聊聊 HTTPS. 一.为什么需要 HTTPS? 众所周知,HTTP 协议具有无连接.不可靠. ...

  7. Perl入门 - Perl方法的使用

    1.定义一个方法 Perl使用sub定义方法. 语法: sub 方法名称{方法体} 2.调用一个方法 Perl直接使用方法名称调用方法. 调用方式有以下四种: 方法名称: &方法名称: 方法名 ...

  8. 单调队列练习题解(切蛋糕&好消息,坏消息)

    单调队列的练习题解 前言: 在上一篇学习记录中,单调队列给出了几道练习题,因为这两道题的算法以及思路相差无几(几乎可以算是双倍经验quq),所以就在这里集中写一下相关的题解 前置知识: 见:队列专题( ...

  9. JavaScript常用API合集汇总(一)

    今天这篇文章跟大家分享一些JavaScript常用的API代码,有DOM操作.CSS操作.对象(Object对象.Array对象.Number对象.String对象.Math对象.JSON对象和Con ...

  10. '%' For instance '%d'

    with each % indicating where one of the other (second, third, ...) arguments is to be substituted, a ...