继承

1:什么是继承

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹。

新建的类成为子类或者派生类。

父类又可以成为基类或者超类。

子类会遗传父类的属性。

2:为什么要用继承

减少代码冗余(也就是重复写代码)。

3:怎么用继承:

我们定义两个类;
class parenclass1:
pass class parenclass2:
pass 在定义两个类: class subclass1: pass class subclass2:
pass 我想让 :
class parenclass1: 作为 class subclass1: 的父类。
pass pass 应该这样用: class subclass1( parenclass1): 这就表示subclass1是子类,parenclass 是subclass1 的父类
pass 两个父类的话怎么表达呢?如下: class subclass2(parenclass1,parenclass2):
pass 这就表示subclass2的父类是parenclass1,parenclass2 这两个

想要查看子类的父类 应该怎样查看呢: 用__bases__  如下:

class ParentClass1:
pass class ParentClass2:
pass class Subclass1(ParentClass1):
pass class Subclass2(ParentClass1,ParentClass2):
pass print(Subclass1.__bases__)
#打印结果:(<class '__main__.ParentClass1'>,) print(Subclass2.__bases__)
#打印结果:
(<class '__main__.ParentClass1'>,
<class '__main__.ParentClass2'>)

经典类与新式类

、只有在python2中才分新式类和经典类,python3中统一都是新式类
、在python2中 没有显示继承的object类的类,以及该类的子类都是经典类
、在python2中,显示的声明继承object的类,以及该类的子类都是新式类
、在python3中,无论是否继承object,都默认 继承object,即python3中所有类均为新式类 至于经典类 与新式类的区别,后面会有讨论。 提示:如果没有指定基类, python的类会默认继承object类, object是所有python类的基类。

二、继承与抽象

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

抽象即抽取类似或者说比较像的部分。

抽象分成两个层次:

1.将奥巴马和梅西这俩对象比较像的部分抽取成类;

2.将人,猪,狗这三个类比较像的部分抽取成父类。

抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度)

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

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

例如:我们写一个老男孩的老师与学生的类,若是不涉及到继承的话  我们正常是这样写

class OldboyTeacher:
school = 'oldboy' def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex def change_score(self):
print('teacher %s is changing score ' %self.name) class Oldboystudent:
    school = 'oldboy’
    def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex def choose(self):
print('student %s choose course' %self.name) tea1 = OldboyTeacher('egon', , 'male') #OldboyTeacher.__init__(...)
stu1=Oldboystudent('alex',,'female') print(tea1.name,tea1.age,tea1.sex) # egon 18 male print(stu1.name) #alex

但是我们经过分析 发现里面里面有许多重复代码, 这时我们可以用到类的继承来写了。如下:

class OldboyPeople:
school ='oldboy' def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex class Oldboyteacher(OldboyPeople):
def change_score(self):
print('teacher %s is changing score ' %self.name)
class Oldboystudent(OldboyPeople):
def choose(self):
print('student %s choose course'%self.name) tea1 = Oldboyteacher('egon', , 'male')
stu1=Oldboystudent('alex',,'female') print(tea1.name,tea1.age,tea1.sex)#egon male
print(stu1.name) #alex

三、基于继承在看属性查找

我们先看一个列子

class Foo:
def f1(self):
print('Foo.f1') def f2(self): #self=obj
print('Foo.f2') #在父类中找到发 f2属性,第3步打印这一行
self.f1() #obj.f1() 第4步再去掉用self的f1属性 class Bar(Foo):
def f1(self):#第五步, 在回到object自身的名称空间找f1属性,找到后调用
print('Bar.f1') #第6步 执行 obj=Bar() #第一步 :类的实例化, 先得到一个空对象, obj.f2() #第2步:空对象调用f2属性 在自身寻找f2属性, 没有找到就去父类中寻找 #结果

Foo.f2
Bar.f1

注意子类的属性查找,一定是优先查找子类自己本身的属性与特征, 在本身没有的情况下 在去父类中查找。

四、派生

派生:子类定义自己新的属性,如果与父类同名,以子类自己的为准。

class OldboyPeople:
school = 'oldboy' def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex def f1(self):
print('爹的f1')
class OldboyTeacher(OldboyPeople):
def change_score(self):
print('teacher %s is changing score' %self.name) def f1(self):
print('儿子的f1') tea1 = OldboyTeacher('egon', , 'male')
tea1.f1() #调用显示:儿子的f1
# 父类和子类中都有f1, 优先调用自己的属性,所以结果调用的是儿子的f1

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

拿上一案例来举例 在oldboyteacher 这个类中要添加薪水与级别。 然后调用。 有两种方式。

方式一:指名道姓的调用(与继承没有什么关系)

class OldboyPeople:
school ='oldboy' def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex def tell_info(self):
print(
'''
====个人信息====
姓名:%s
年龄:%s
性别:%s
'''%(self.name,self.age,self.sex)) class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,level,salary):
OldboyPeople.__init__(self,name,age,sex) #在这里指明道姓来调用这一个函数里的属性 self.level =level
self.salary=salary def tell_info(self):
OldboyPeople.tell_info(self) #指名道姓的来调用这个函数里的属性
print("""
等级:%s
薪资:%s
""" %(self.level,self.salary)) tea1 = OldboyTeacher('egon', , 'male', , 3.1)
print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) tea1.tell_info() #打印结果:
egon male 3.1 ====个人信息====
姓名:egon
年龄:
性别:male 等级:
薪资:3.1

方法二、

用super()调用(严格依赖于继承)

super() 的返回值是一个特殊的对象,该对象专门用来调用父类中的属性, 一般在python2中,需要super(自己的类名,self),  而python3中,括号里面一般不填类名

class OldboyPeople:
school = 'oldboy' def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex def tell_info(self):
print("""
===========个人信息==========
姓名:%s
年龄:%s
性别:%s
""" %(self.name,self.age,self.sex)) class OldboyTeacher(OldboyPeople): def __init__(self, name, age, sex, level, salary):
super().__init__(name,age,sex) self.level = level
self.salary = salary def tell_info(self):
super().tell_info()
print("""
等级:%s
薪资:%s
""" %(self.level,self.salary)) tea1 = OldboyTeacher('egon', , 'male', , 3.1)
print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary)
tea1.tell_info() #调用结果:
egon male 3.1 ===========个人信息==========
姓名:egon
年龄:
性别:male 等级:
薪资:3.1

六:经典类 与新式类

1新式类:

继承object的类,以及该类的子类,都是新式类

在python3中,如果一个类没有指定继承的父类,默认就继承object

所以说在python3中所有的类都是新式类

2经典类:(只有在python2才区分经典类和新式类):

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

1 经典类:深度优先

2 新式类:广度优先

如果继承关系为非菱形结果吗则会按照先找B 这一条分支,然后在找c这一条分支,最后找D这一条分支的顺序,直到找到我们想要的属性

当继承关系为菱形结构时

经典类查找顺序:

若是在A 类里自己没找到, 则会先去B类里去找, B类里没找到,就会在E类里找, 然后在G类里找,

G类里没找到 会去C 类里找, 然后去F 类里找,最后去D 类里找。

新式类查找顺序:

按照图中1 ,2 , 3, 4,5,6的顺序查找, 这个为广度优先的查找方式

七:  super()依赖继承

super()会严格按照mro列表从当前查找到的位置继续往后查找

class A:
def test(self):
print('A.test') # 执行这一步 打印
super().f1 # 然后在调用父类里的f1, 根据C.mro里的查找顺序执行到A 往后继续执行到B里去查找 class B:
def f1(self): #4找到f1, 执行
print('from B') #5打印 class C(A,B):
pass c=C()
print(C.mro()) #调用属性的顺序 [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>] c.test() #:C里没有 ,去A里调用 #打印结果 A.test

from B

PYTHON3中 类的继承的更多相关文章

  1. Python3 面向对象-类的继承与派生

    1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类可称为基类或超类,新建的类称为派生类和或子类. 子类会遗传父类的属性,从而解决代码重用问题. ...

  2. Python3中的super()函数详解

    关于Python3中的super()函数 我们都知道,在Python3中子类在继承父类的时候,当子类中的方法与父类中的方法重名时,子类中的方法会覆盖父类中的方法, 那么,如果我们想实现同时调用父类和子 ...

  3. javascript“类”与继承总结和回顾

    Javascipt语法不支持"类"(class)[es6已经支持],但是有模拟类的方法.今天我主要谈谈Javascipt中模拟“类”的方法及js中继承的总结和回顾. js中实现“类 ...

  4. python3 入门 (四) 类与继承

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...

  5. 论python3下“多态”与“继承”中坑

    1.背景: 近日切换到python3后,发现python3在多态处理上,有一些比较有意思的情况,特别记载,供大家参考... 以廖老师的python3教程中的animal 和dog的继承一节的代码做例子 ...

  6. python中的面向对象学习以及类的继承和继承顺序

    继承 首先编写一串关于类的代码行: __author__ = "Yanfeixu" # class People: 经典类不用加(object) class People(obje ...

  7. python中的类与继承

    Class 类的定义以及实例的建立 Python中,类通过 class 关键字定义. 例如最简单的一个类定义可以为: class Person(object): pass Python 的编程习惯,类 ...

  8. Python3 类的继承

    目录 继承的基本概念 什么是继承 继承有什么用 如何实现继承 初识继承 寻找继承关系 如何寻找继承关系 实例演示 继承背景下的对象属性查找顺序 派生 新式类和经典类 钻石继承 通过继承实现修改json ...

  9. lua中基类和“继承机制”

    基类:基类定义了所有对于派生类来说普通的属性和方法,派生类从基类继承所需的属性和方法,且在派生类中增加新的属性和方法. 继承:继承是C++语言的一种重要机制,它允许在已定义的类的基础上产生新类. lu ...

随机推荐

  1. Active Directory虚拟机搭建域控服务器环境

    前言 还是和上一章一样,痛苦过后还是记录下给后来人提供便利为妙. 虚拟机选择:建议Hyper-V或者VMware 系统选择:建议WIindows Server 2003及以上 我这里是使用VMware ...

  2. Sass编译css/Grunt压缩文件

    Sass安装(mac) $ sudo gem install sass scss编译成css文件 $ sass ui.scss ui.css CLI安装 $ npm install -g grunt- ...

  3. 不为客户连接创建子进程的并发回射服务器( poll实现 )

    前言 在上文中,我使用select函数实现了不为客户连接创建子进程的并发回射服务器( 点此进入 ).但其中有个细节确实有点麻烦,那就是还得设置一个client数组用来标记select监听描述符集中被设 ...

  4. git 安装及命令

    一.window下的git安装 1.安装教程 网上教程一堆.我參考的是这个:Git_Windows 系统下Git安装图解 还有这个也不错 2.环境搭建: 在配置完毕后,自己主动载入到系统环境变量中.如 ...

  5. Js 模拟鼠标点击事件

    var obj = document.getElementById('go'); if(document.all){ obj.click(); }else{ var e = document.crea ...

  6. redis的主从复制和哨兵支持的主从切换

    1 主从复制的目的是为了读写分离 master写,然后同步到slave,slave只管读. 2 哨兵存在的目的 是为了主从切换,如果master挂了,那么一个slave成为master,重启之后的ma ...

  7. SPDY: An experimental protocol for a faster web HTTP/2

    http://www.chromium.org/spdy/spdy-whitepaper https://en.wikipedia.org/wiki/SPDY Internet protocol su ...

  8. CMake命令笔记

    project 为整个工程设置名称.版本和启用语言 project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])projec ...

  9. TTimer源码研究

    TTimerProc = procedure of object; IFMXTimerService = interface(IInterface) ['{856E938B-FF7B-4E13-85D ...

  10. Delphi 7以来的Delphi 2009测试版新语法特性

    我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...