day 24-1 继承
继承
什么是继承:
继承是一种创建新类的方式,在 python 中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
父类必须在子类上面
一个类 可以被多个类继承
一个类 可以继承多个父类 —— python 里
class A:pass #父类 基类 超类
class B:pass
class A_son(A):pass #子类 派生类
class AB_son(A,B):pass print(A_son.__bases__) #查看 A_son 继承了谁,查看父类用的
print(AB_son.__bases__)
print(A.__bases__) #在 python 中任何一个没有父类的类都是 object 类的儿子(类的祖宗)
print(B.__bases__) # python3 -新式类 #没有继承父类默认继承 object
单继承 *****
人狗大战
可以发现下面有共同属性
#可以发现下面有共同属性
class Person:
def __init__(self,name,hp,aggr,sex):
self.name = name
self.hp = hp
self.aggr = aggr
self.sex = sex class Dog:
def __init__(self,name,hp,aggr,kind):
self.name = name
self.hp = hp
self.aggr = aggr
self.kind = kind
接下来我们把重复代码提出出来 —— 单继承
class Animal:
def __init__(self,name,hp,aggr):
self.name = name
self.hp = hp
self.aggr = aggr
def eat(self):
print('吃药回血')
self.hp += 100 class Person(Animal):
def __init__(self,name,hp,aggr,sex):
Animal.__init__(self,name,hp,aggr)
self.sex = sex #派生属性
def attack(self,dog): #派生方法
dog.hp -= self.aggr class Dog(Animal):
def __init__(self,name,hp,aggr,kind):
Animal.__init__(self,name,hp,aggr)
self.kind = kind #派生属性
#假如说 dog 吃药后,还想加点攻击力
def eat(self): #派生方法
Animal.eat(self) #与调用父类中的方法相结合
self.aggr += 15 #然后实例化
per = Person('无极',200,30,'男')
dog = Dog('二哈',200,15,'Poodle')
#print(per.__dict__) #查看继承的属性
#print(dog.__dict__) per.attack(dog)
print(dog.hp)
dog.eat()
print(dog.hp,dog.aggr)
派生
当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己的为准了
父类中没有的属性 在子类中出现 叫做派生属性
父类中没有的方法 在子类中出现 叫做派生方法
只要是子类的对象调用,子类中有的名字 一定用子类的,子类中没有才找父类的,如果父类也没有报错
如果父类 子类都有 用子类的
如果还想用父类的,单独调用父类的:
父类名.方法名 需要自己传 self 参数
super().方法名 不需要自己传 self
正常的代码中 单继承 === 减少了代码的重复
继承表达的是一种 子类和父类的关系
super 的用法
只在新式类中有,python3 中所有类都是新式类
在类中使用 不需要传 self 参数,在类外使用必须要传 类 和 对象
查找自己所在类的父类
class Animal:
def __init__(self,name,hp,aggr):
self.name = name
self.hp = hp
self.aggr = aggr
def eat(self):
print('吃药加血')
self.hp += 100 class Person(Animal):
def __init__(self,name,hp,aggr,sex):
#Animal.__init__(self,name,hp,aggr)
super().__init__(name,hp,aggr) #不需要传 self 了,对于单继承 super 就可以找到父类了
self.sex = sex #派生属性
per = Person('凯子',500,20,'男')
print(per.__dict__)
#也可以在类外用
#传一个 类 和一个 对象
super(Person,per).eat()
print(per.hp) #原本是 500
多继承 ***
class A:
def func(self):
print("A") class B:
def func(self):
print("B") class C:
def func(self):
print("C") class D(A,B,C): #调用是从左向右的顺序
pass
#def func(self): #这里注释掉调用的就是 A
# print('D') d = D()
d.func()
钻石继承问题
遵循广度优先(适用于多个继承都可以找到 A 时) 然后在找深度
新式类中的继承顺序 : 广度优先
class A:
def func(self):
print("A") class B(A): #2.这里也注释掉调用的是 C
pass
#def func(self):
# print("B") class C(A): #3.这里也注释掉调用的是 A
pass
#def func(self):
# print("C") class D(B,C):
pass
#def func(self): #1.这里注释掉调用的是 B
# print('D') d = D()
d.func()
print(D.mro()) #记录了继承关系
super 的多继承问题
super 的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的
super 调用顺序是根据广度优先的反向来调用的
class A(object):
def func(self): print('A') class B(A):
def func(self):
super().func()
print('B') class C(A):
def func(self):
super().func()
print('C') class D(B,C):
def func(self):
super().func()
print('D') b = D()
b.func()
小结:
继承 : 什么是什么的关系
单继承 *****
先抽象再继承,几个类之间的相同代码抽象出来,成为父类
子类自己没有的名字,就可以使用父类的方法和属性
如果子类自己有,一定是先用自己的
在类中使用 self 的时候,一定要看清楚 self 指向谁
多继承 ***
新式类和经典类:
多继承寻找名字的顺序 : 新式类广度优先,经典类深度优先
新式类中 有一个类名 .mro 方法,查看广度优先的继承顺序
python3 中有一个 super 方法,根据广度优先的继承顺序查找上一个类
2.7
新式类 继承 object 类的才是新式类 广度优先
经典类 如果你直接创建一个类在 2.7 中就是经典类 深度优先
print(D.mro())
D.mro()
单继承:子类有的用子类 子类没有用父类
多继承中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是什么?
经典类中 深度优先
新式类中 广度优先
python2.7 新式类和经典类共存,新式类要继承 object
python3 只有新式类,默认继承 object
经典类和新式类还有一个区别 mro 方法只在新式类中存在
super 只在 python3 中存在
super 的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的
day 24-1 继承的更多相关文章
- 夺命雷公狗—angularjs—24—extend继承对象
我们的angularjs中也是给我们留下了方法来做继承的,那么他就是传授中的extend... 不过要如下所示,第二个参数是继承到第一个对象里面的... <!DOCTYPE html> & ...
- 无废话ExtJs 入门教程二十一[继承:Extend]
无废话ExtJs 入门教程二十一[继承:Extend] extjs技术交流,欢迎加群(201926085) 在开发中,我们在使用视图组件时,经常要设置宽度,高度,标题等属性.而这些属性可以通过“继承” ...
- C++因继承引发的隐藏与重写
在区分隐藏和重写之前,先来理一理关于继承的东西... [继承] 继承是面向对象复用的重要手段.通过继承定义一个类,继承是类型之间的关系建模,共享公有的东西,实现各自本质不同的东西.简单的说,继承就是指 ...
- JavaScript继承的几种实现
0 什么是继承 继承就是获得存在对象已有的属性和方法的一种方式. [2019.4.26 更新]今日又重新学习了一下JS的继承,在这里整理一下以前的笔记并补充一些新的感悟. 1 JS中继承的几种实现方法 ...
- C++继承引入的隐藏与重写
在区分隐藏和重写之前,先来理一理关于继承的东西... [继承] 继承是面向对象复用的重要手段,是类型之间的关系建模.通过继承一个类,共享公有的东西,实现各自本质不同的东西.简单的说,继承就是指一个对象 ...
- Ruby中类的进阶(继承,private, public, protect)
类中的public,protect,private public method class Point def test end end 这样定义的test方法就是一个public方法可以在类内外使用 ...
- C++面试题汇集
1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以 ...
- Python & Django 学习笔记
最近在学校Python和Django.在学习中遇到了种种的问题,对于一个新手来说,下面的问题可能都会遇到.希望能帮助到那些和我一样的人!!0.python-dev安装(ubuntu) apt-get ...
- python&django 常见问题及解决方法
0.python-dev安装(ubuntu) apt-get install python-dev 1.Open(filename,mode) 报错实例: f = open('d:\Users\16 ...
- C++面试常见问题
转载:https://zhuanlan.zhihu.com/p/34016871?utm_source=qq&utm_medium=social 1.在C++ 程序中调用被C 编译器编译后的函 ...
随机推荐
- @EnableFeignClients 注解
feignClents在spring容器里找不到的原因 当使用的feignClents 来自引用别的工程时,需要指定包名,如果不指定就算使用ComponentScan 扫描也不行 import org ...
- SpringCloud-Gateway
在微服务架构中,我们会遇到这样的问题:1.在调用微服务时,需要鉴权,微服务不能任意给外部调用.但是,多个微服务如果都需要同一套鉴权规则,明显会产生冗余,如果鉴权方法需要修改,则需要改动多个地方.2.在 ...
- [LeetCode] 18. 四数之和
题目链接:https://leetcode-cn.com/problems/4sum/ 题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个 ...
- CSS3动画效果transition
1.transition的浏览器支持情况 IE10+支持,IE6\7\8\9都不支持!目前,其他浏览器最新版本都支持,不需要再加前缀 -webkit- 之类的了 2. 还是一步一步说说怎么用trans ...
- Manifest merger failed : Attribute application@icon value=(@mipmap/ic_launcher) from AndroidManifest
情况是这样子的,导入一个比较老的项目(两年前),它依赖于一个 Libraray,已经先导入了 library,现在导入项目的时候出了错 (1) Android Studio 目前提供将 SDK包成 . ...
- 2019-04-09 SpringBoot+Druid+MyBatis+Atomikos 的多数据源配置
前面部分是网上找的,我按照网上写的把自己搭建的过程展示一次 1.引入依赖 目前项目本来使用到了Mybatis plus(在自己的Mapper接口中继承BaseMapper获得基本的CRUD,而不需要增 ...
- Docker常用镜像
Docker,具有快捷方便的特性,机器上不需要安装软件和进行各种配置,拉取镜像,一行命令即可启动服务,不使用时,一行命令关闭容器即可,快捷方便,干净.利索.建议将本地的redis.mysql.kafk ...
- gulp 入门使用
gulp 入门使用 使用场景 相信大家在传统的开发模式下 都是 html + css + js 然后静态文件不经过任何处理 部署到服务器,这样会有很多漏洞例如: 1.在网站上查看F12 就可以看到 ...
- Tomcat启动报错,报找不到gdk_custom.jar
在 tomcat/conf/context.xml 中新增如下配置 <Context> ... <JarScanner scanManifest="false"/ ...
- centos 桌面没有有线设置,不能上网
1.ifconfig 发现缺少网卡 ensxx 2.cd /etc/sysconfig/network-scripts/ 发现有网卡ens的配置文件,只是没有启动 3.ifconfig -a 发现有 ...