一、继承介绍

继承是一种新建类的方式,新建的类称之为子类或者派生类,被继承的类称为父类/基类/超类

python中继承的特点:

  1.子类可以遗传/重用父类的属性

  2.子类可以有多个父类

  3.Python中的继承类分为新式类和经典类

    新式类:继承了object的类,以及他的子类都是新式类

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

    在Python3中,没有显示的声明,默认继承object类,所有的类都是新式类

    在Python2中才区分新式类和经典类,没有显示继承任何类,也不会继承object类。

使用继承的好处:减少类与类之间的代码冗余

二、继承的定义

在子类中加括号,括号里加上父类

class parent1:
x=111 class sub1(parent1):
pass

调用属性,查看父类:

class parent1:
x=111 class parent2:
x=222 class sub1(parent1):
pass class sub2(parent1,parent2):
pass print(parent1.__bases__)#查看父类 (<class 'object'>,)
print(sub1.__bases__)#(<class '__main__.parent1'>,)
print(sub2.__bases__)#(<class '__main__.parent1'>, <class '__main__.parent2'>)
obj = sub1()
print(obj.x)#

三、利用继承解决类与类之间的代码冗余问题

可以将类与类之间的重复代码定义在一个父类中,思考的时候从下往上思考统计

class OldboyPeople:
school = 'Oldboy' def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex class OldboyStudent(OldboyPeople): def choose_course(self):
print('%s choosing course' % self.name) class OldboyTeacher(OldboyPeople): def score(self,stu,num):
stu.score=num stu1=OldboyStudent('刘二蛋',38,'male')
print(stu1.__dict__) tea1=OldboyTeacher('egon',18,'male')
print(tea1.__dict__)

不过这个时候,不同的类要是想用自己独有的属性应该怎么办呢?

在子类派生的新方法中重用父类的功能 方式一:

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

class OldboyPeople:
school = 'Oldboy' def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex class OldboyStudent(OldboyPeople):
def __init__(self, name, age, sex, score=0):
OldboyPeople.__init__(self,name,age,sex)
self.score = score def choose_course(self):
print('%s choosing course' % self.name) class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,level):
OldboyPeople.__init__(self,name,age,sex)
self.level=level def score(self,stu,num):
stu.score=num stu1=OldboyStudent('刘二蛋',38,'male')
print(stu1.__dict__) tea1=OldboyTeacher('egon',18,'male',10)
print(tea1.__dict__)

总结:

  1.与继承无关

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

在学习子类派生方法中重用父类的功能第二个方式之前先来说一下在继承背景下的属性查找

1.单继承状态下的属性查找:

class Foo:
xxx=444
pass
class Bar1(Foo):
# xxx=333
pass class Bar2(Bar1):
# xxx=222
pass
obj=Bar2()
# obj.xxx=111 print(obj.xxx)#

单继承查找的优先级别:对象->对象的类->父类->object

2.多继承状态下的属性查找:

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

class G:
x = 'G'
pass # 第三层
class E(G):
# x = 'E'
pass class F:
# x = 'F'
pass # 第二层
class B(E):
# x = 'B'
pass class C(F):
# x = 'C'
pass class D:
# x = 'D'
pass # 第一层
class A(B, C, D):
# x = 'A'
pass obj = A()
# obj.x = 111
print(obj.x)

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

菱形继承:属性的查找方式有两种,深度优先和广度优先

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

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

继承原理:

  对于定义的每一个类,Python会计算出一个方法解析顺序(MRO)列表,这个列表就是一个简单的所有基类的线性顺序表

# 第四层:
class G(object):
# x = 'G'
pass # 第三层
class E(G):
# x = 'E'
pass class F(G):
# x = 'F'
pass # 第二层
class B(E):
# x = 'B'
pass class C(F):
# x = 'C'
pass class D(G):
# x = 'D'
pass # 第一层
class A(B, C, D):
# x = 'A'
pass obj=A()
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.G'>, <class 'object'>]

注:今天威老师讲了一个很好记的方式,就是先深度查找,然后去除前面重复的,留下的就是查找属性的顺序。

在子类派生的新方法中重用父类的功能 方式二:

super()必须在类中使用

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

在Python3中:super()

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

总结:

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

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

class OldboyPeople:
school = 'Oldboy' def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex class OldboyStudent(OldboyPeople):
def __init__(self, name, age, sex, score=0):
super(OldboyStudent,self).__init__(name,age,sex)
self.score = score def choose_course(self):
print('%s choosing course' % self.name) class OldboyTeacher(OldboyPeople):
def __init__(self,name,age,sex,level):
super().__init__(name,age,sex)
self.level=level def score(self,stu,num):
stu.score=num stu1=OldboyStudent('刘二蛋',38,'male')
print(stu1.__dict__) tea1=OldboyTeacher('egon',18,'male',10)
print(tea1.__dict__)

还是需要加油学习!

python-面向对象之继承的更多相关文章

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

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

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

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

  3. Python面向对象03 /继承

    Python面向对象03 /继承 目录 Python面向对象03 /继承 1. 初识继承 2. 单继承 3. 多继承 4. 总结 1. 初识继承 概念:专业角度:如果B类继承A类,B类就称为子类,派生 ...

  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中类的继承分为:单继承和多继承,如果是多继承的 ...

  10. 十七、Python面向对象之继承

    在面向对象,继承是一个很重要的特性 子类与父类,子类是对父类的一种扩展,在父类的属性和方法上进行一些扩展 示例:没带继承   #定义一个带编号和状态的门的类 class Door(object): d ...

随机推荐

  1. vue-cli3 第三版安装搭建项目

    Vue CLI是一个用于快速Vue.js开发的完整系统 3.X较2.X结构变了很多,更优雅,开发体验更好 官方:https://cli.vuejs.org/guide/ 安装:https://cli. ...

  2. C#窗口闪烁问题解决

    https://www.cnblogs.com/AndyDai/p/5203798.html 开发WinForm 程序时经常会遇到闪屏的问题,这会给用户造成很差的使用体验,所以必须妥善解决好这个问题. ...

  3. spring注解第01课 @Configuration、@Bean

    一.原始的 xml配置方式 1.Spring pom 依赖 <dependency> <groupId>org.springframework</groupId> ...

  4. 13.CrawlSpider类爬虫

    1.CrawlSpider介绍 Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 此案例采用的是CrawlSpider类实现爬虫. 它是Spider的派生类,Spider类的设 ...

  5. iOS拍照图片旋转的问题

    很久之前,遇到了这种情况,iOS某端拍照上传到服务器,其他iOS端从服务器下载该照片展示,发现图片逆时针旋转了90度.当时百度了一下,找到一段代码修正image方向,问题解决了,但没有深入理解底层原理 ...

  6. Web获取客户端物理MAC地址(ocx插件)ActiveX控件

    主要是通过ActiveX控件 从本地获取到MAC地址,传入到浏览器打开的网页中,再提交到服务器. 具体详解与步骤看文档中: 文件实例包下载 DotNetFX 文件夹附件文件:(可能安装时需用) dot ...

  7. Burp Suite Intruder中爆破模式介绍

    Burp Suite Intruder中爆破模式介绍 - Introduction to Burst Mode in Burp Suite Intruder 1.sniper模式  使用单一的Payl ...

  8. [C++]3-1 得分(Score ACM-ICPC Seoul 2005,UVa1585)

    Question 习题3-1 得分(Score ACM-ICPC Seoul 2005,UVa1585) 题目:给出一个由O和X组成的串(长度为1~80),统计得分. 每个O的分数为目前连续出现的O的 ...

  9. cocos2dx 屏幕分辨率

    http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework ...

  10. 第27月第12天 webrtc ios openssl boost

    1. source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pla ...