day21_7.25 面向对象之继承
一。继承
什么是继承?
继承是一种关系,就是描述两者之间什么是什么的关系。
在程序中,继承描述的是类与类之间的关系。
例如a如果继承了b,a就具备了b的所有变量与方法,可以直接调用。
class B:
text=2 class A(B):
pass print(A.text)
#
a称之为子类,b称之为父类,也就是基类。
为什么要使用继承?
在程序中,使用了继承就会提很多效率。
继承的一方直接使用被继承一方已经有的东西。这样就可以重用已经有 的代码,提高重用性。
如何使用继承?
在上述例子中我们已经使用过一次继承了。
在python中,一个子类可以继承多个父类,在其他语言中是做不到的。
二。抽象
抽象也是面向对象中比较重要的一个概念。
抽象的定义就是不具体,不清除,看不懂的东西。
在众多类中,发现其共同点,将其共同点重新建立一个类,这个过程被称之为抽象。抽象之后,所有的有其共同的点的类都可以将此抽象类作为它们的父类。
所有为了简化开发过程,应该:
1.先抽象再继承
2.继承一个已经存在的类,扩展或是修改原始的功能。
三。属性的查找顺序
class A1:
text=1 class B2(A1):
text=2 b1=B2()
b1.text=3
print(b1.text)
输出b1.text当其对象自己没有对text赋值时,会寻找该类中默认的值,如果,该类中没有,则在其父类中寻找。所有查找的顺序是:
对象自己的 - > 所在类中 -> 找父类 - >父类的父类 ->Object
四。派生
当一个字类中出现了与父类中不同的内容时,这个字类就是派生类。
而当一个子类与父类完全一样时,这个子类也就没有存在的必要了,所以,在python中每个类都是派生类。派生类就是指子类。
五。覆盖 overrides
覆盖指的是子类中出现了与父类完全一样答名的属性和方法。
六。子类访问父类的方法
在子类中,若想要访问父类中的某些方法时,需要用到super(),方法:
1.super(当前类名称,self).你要调的父类的属性或方法
class Father():
def say_6(self):
print('') class Son(Father):
def __init__(self):
super(Son,self).say_6()
super().say_6()
Father.say_6(self) son1=Son()
#
#
#
2.super().你要调的分类的属性或方法
3.类名。你要调的父类的属性和方法(self),当子类多继承时,这类方法可以选定父类,调用其中的方法。
这一种方法与继承无关,是存粹的父类中的方法。
七。子类中的初始化。
再子类覆盖了父类中__init__方法后,必须在子类中的__init__使用super方法调用父类中的__init__,并传入其所需要的参数,否则会丢失父类中的某些特征。
class Staff:
def __init__(self, name, gender, age, wages):
self.name = name
self.gender = gender
self.age = age
self.wages = wages class Programmer(Staff):
def __init__(self, name, gender, age, wages,Skill):
super().__init__(name, gender, age, wages)
self.Skill=Skill
八。组合。
当我们需要某个功能,而这个功能不能通过继承来获得时,就可以使用组合。
组合就是将另一个类当成初始属性传入另一个类中。
举个例子,在英雄联盟中有英雄,也有装备,当英雄类需要攻击时需要攻击力,装备有攻击力,英雄需要获得攻击力并不能继承武器,因为武器和一英雄不是一类,所以可以将武器作为一个属性传入英雄类,当英雄需要攻击时,可以调用英雄中的武器进行攻击,如下,模拟了盖伦使用多兰打了瑞文10点血。
class Equipment:
def __init__(self,name,attack):
self.name=name
self.attack=attack def staff(self,opp):
opp.hp-=10 class Hero:
def __init__(self,name,hp,equipment=1):
self.name=name
self.hp=hp
self.equipment=equipment duolan=Equipment('多兰',10)
garin=Hero('盖伦',100,duolan)
ruiwen=Hero('瑞文',100,0)
garin.equipment.staff(ruiwen)
print(garin.hp,ruiwen.hp)
#100,90
组合比继承更加降低了耦合性。
九。菱形继承
当一个类有多个父类,且多个父类有共同的基类,这就叫做菱形继承。
补充:新式类和经典类
新式类:任何显示或隐式地继承自object的类称之为新式类(python3中任何类都是继承自object类,python全是新式类)
经典类:不是object的子类,只有在python中出现
补充遍历图
图为在python3中的遍历顺序

图为python3中的遍历

图为python3和python2中的遍历

当出现了菱形继承时,新式类先深度遍历,当遇到共同父类时就广度
新式类就是深度优先。
day21_7.25 面向对象之继承的更多相关文章
- 25 面向对象编程 继承概念 代码 快捷键 super注意点
继承概念 继承的本质是对某一批的抽象,从而实现对现实世界更美好的建模. extends的意思的"扩展".子类是父类的扩展. JAVA中类只有单继承,没有多继承!理解:一个儿子只能有 ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- 黑马程序员_Java面向对象2_继承
4.面向对象_继承 4.1继承的概述 提高了代码的复用性. 让类与类之间产生了关系,有了这个关系,才有多态的特性. 注意:千万不要为了获取其他类的功能而去继承,简化代码而继承.必须是类与类之间有所属关 ...
- C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域
面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...
- 【Java基础】【08面向对象_继承&方法&final】
08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- 面向对象多继承(c3算法)、网络基础和编写网络相关的程序
一.面向对象多继承(c3算法) a.有多个父类先找左,再找右,如下示例: class A(object): pass class B(object): def f1(self): print('B') ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- python之面向对象(继承)
类的继承 python之面向对象(继承) 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 c ...
随机推荐
- LG2495 「SDOI2011」消耗战 虚树
问题描述 LG2495 题解 虚树 \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; #define int l ...
- angular6.x 引入echarts
因为angular2+ 使用 ==typescript==开发,所以想要使用echarts,必须安装echarts针对angular的插件ngx-echarts.本文案列实际效果如上图. 安装ngx- ...
- ZooKeeper 入门看这篇就够了
什么是 ZooKeeper? ZooKeeper 是一个分布式的,开放源码的分布式应用程序协同服务.ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原 ...
- Allure自动化测试报告我是这样用的
关于自动化测试报告: 之前用过testNG自带的测试报告.优化过reportNG的测试报告.extentreport.Zreport(大飞总原创),这些是我之前都用过的,也是在去年雯姐和我说过Allu ...
- NXP官方的i.mx6ul板级uboot源码适配
1.前言 CoM-P6UL是盈鹏飞科技有限公司基于NXP原厂I.MX6UL芯片生产研发的核心板,本文将对CoM-P6UL适配NXP的基于Linux4.1.15版本的uboot板级源码. 2.开发环境 ...
- 解决 “version `GLIBCXX_3.4.21' not found ”问题
https://blog.csdn.net/Heldrecom/article/details/85040411
- linq 大数据 sql 查询及分页优化
前提: 需要nuget PredicateLib 0.0.5: SqlServer 2008R2 (建议安装 64 位): .net 4.5 或以上: 当前电脑配置: I7 4核 3.6G ...
- 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)
[UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就 ...
- WPF-如何添加用户控件(同一个程序集与非同一个程序集)
在WPF中,假如十个按钮与十个文本框需要在窗体中多次使用,每次都都要重新添加这二十个按钮,显然是不可取的.这时,可以把这二十个按钮封装成一个UserControl,然后多次引用. 一.新建一个用户控件 ...
- C#通过PInvoke调用c++函数的备忘录
目前知道的情况被调用的C/C++函数只能是全局函数 不能调用类中的成员方法 被调用的C函数必须使用extern “C“包含,保证采用的导出函数名生成规则和.NET一致 函数调用约定通常使用WINAPI ...