面向对象—继承(Day19)
初识继承
继承是一种创建新类的方式,在python中新类可以继承一个或多个父类,父类又可称为基类或超类,新建的类为派生类或子类。(类与类之间的关系是什么是什么的关系。)
继承语法:
class Parent:pass
class Son(Parent):pass #Son继承了Parent
print(Son.__bases__) #(<class '__main__.Parent'>,)
print(Parent.__bases__) #(<class 'object'>,)
内置属性:__bases__用来查看当前类的父类是谁
在python3中所有的类都会默认继承object类,继承了object类的所有类都是新式类,如果一个类没有继承任何父类,那么__bases__属性就会显示(<class 'object'>,)。
继承分为单继承和多继承:
单继承:继承一个父类,所有面向对象语言都有单继承的特点。
多继承:可以继承多个父类。
class Parent1:pass
class Parent2:pass
class Parent3:pass
class Son(Parent1,Parent2,Parent3):pass #Son继承了多个父类
print(Son.__bases__) #(<class '__main__.Parent1'>, <class '__main__.Parent2'>, <class '__main__.Parent3'>)
实例:
class Animal:#定义一个父类
def __init__(self,name,hp,ad): # 共有的属性
self.name = name
self.hp = hp
self.ad = ad class Person(Animal): #定义一个子类,继承父类
pass
class Dog(Animal):#定义一个子类,继承父类
pass alex = Person('alex',10,20)
teddy = Dog('teddy',50,60)
print(alex.__dict__)
print(teddy.__dict__)
派生:子类可以添加自己新的属性,或者在自己这里重新定义这些属性,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己的为准。
class Animal:#定义一个父类
def __init__(self,name,hp,ad): # 共有的属性
self.name = name
self.hp = hp
self.ad = ad class Person(Animal): #定义一个子类,继承父类
def attack(self,dog): #子类自己的属性,派生方法
print('%s攻击了%s' % (self.name,dog.name))
class Dog(Animal):#定义一个子类,继承父类
def bite(self,person): #子类自己的属性,派生方法
print('%s咬了%s' % (self.name,person.name)) alex = Person('alex',10,20)
teddy = Dog('teddy',50,60)
alex.attack(teddy) #alex攻击了teddy
teddy.bite(alex) # ddy咬了alex
class Animal:#定义一个父类
def __init__(self,name,hp,ad): # 共有的属性
self.name = name
self.hp = hp
self.ad = ad
def eat(self):
print('%s吃药回血了' %self.name) class Person(Animal): #定义一个子类,继承父类
def attack(self,dog): #子类自己的属性,派生方法
print('%s攻击了%s' % (self.name,dog.name))
def eat2(self):
print('执行了person类的eat方法')
self.money = 100
self.money -= 10
self.hp += 10
class Dog(Animal):#定义一个子类,继承父类
def bite(self,person): #子类自己的属性,派生方法
print('%s咬了%s' % (self.name,person.name)) alex = Person('alex',10,20)
teddy = Dog('teddy',50,60)
teddy.eat() #teddy吃药回血了
alex.eat2()
alex.eat() #alex吃药回血了
alex.eat = '123'
print(alex.eat())#对象自己内存空间里有了eat,不找类及父类中的
对象使用名字的顺序:先找对象自己内存空间里的,再找对象自己类内存空间里的,再找父类例的。
self.名字的时候,不要看self当前在哪个类里,要看这个self到底是谁的对象。
class Parent:
def func(self):
print('in parent func')
def __init__(self):
self.func() class Son(Parent):
def func(self):
print('in son func')
s = Son() #in son func

object类:新式类默认继承object
继承与派生
1.在类中增加派生属性的方法:
父类名.__init__(属性名),
super(类名,self).__init__(属性名,不加self),可以简化成super()..__init__(属性名,不加self),在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self。
2.调用派生方法时子类中有找子类的,子类中没有找父类的,子类中有但是想要找父类中的有两种方法:
1)父类名.方法名(子类对象)
2)super(子类名,子类对象).方法() 这种方法一般不用,一般在子类内用super()
class Animal:
def __init__(self,name,hp,ad):
self.name = name # 对象属性 属性
self.hp = hp #血量
self.ad = ad #攻击力
def eat(self):
print('eating in Animal') class Person(Animal):
def __init__(self,name,hp,ad,sex):
# Animal.__init__(self,name,hp,ad)
super().__init__(name,hp,ad) # super(Person,self).__init__(name,hp,ad)
self.sex = sex # 派生属性
def attack(self,dog): # 派生方法
print("%s攻击了%s"%(self.name,dog.name))
def eat(self):
super().eat() #找父类里的方法
print('eating in Person') class Dog(Animal):
def __init__(self,name,hp,ad,kind):
Animal.__init__(self,name,hp,ad)# 类名.方法名
self.kind = kind
def bite(self,person): # 派生方法
print("%s咬了%s" % (self.name, person.name)) # 人 sex
alex = Person('alex',100,10,'female') # 实例化
teddy = Dog('tom',200,50,'泰迪')
print(alex.__dict__)
print(teddy.__dict__)
Animal.eat(alex)#指名道姓法
super(Person,alex).eat()
alex.eat()
钻石继承
新式类多继承顺序:广度优先的算法,保证每个类都能找一遍
class A:
def func(self):
print('A')
class B(A):
def func(self):
print('B')
class C(A):
def func(self):
print('C')
class D(B,C):
def func(self):
print('D') d = D()
d.func()


super在单继承中就是单纯的寻找父类
在多继承中就是根据当前模型所在的位置按照广度优先的算法找下一个类。

经典类多继承顺序:深度优先算法

经典类:在python2x版本中存在,且不继承object类,遍历时遵循深度优先的算法,没有mro方法,没有super方法。
新式类:python3x版本中只有新式类,python2x版本中需要继承object的才是新式类,遍历时遵循广度优先的算法,有super方法,但是在2.X版本的解释器中,必须传参数(子类名,子类对象),有mro方法。
面向对象—继承(Day19)的更多相关文章
- OC面向对象—继承
OC面向对象—继承 一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). ...
- 面向对象继承实例(a如何继承b)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- js面向对象继承
前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2 ...
- Php面向对象 – 继承和重写
Php面向对象 – 继承和重写 承受: php于,通过类.使用特殊的经营宗旨. 通过定义类,采用extends来表示当前的类对象继承该类的对象. 样例: class C { public $p_c ...
- Java面向对象 继承(下)
Java面向对象 继承(下) 知识概要: (1)抽象类 1.1 抽象类概述 1.2 抽象类的特点 ...
- Java面向对象 继承(上)
Java面向对象 继承 知识概要: (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...
- js高级-面向对象继承
一.工厂模式创建对象及优缺点 继承就是把公共的部分抽象出来作为父类,基类.吃饭,跑步等 var a = {}; //批量创建不方便,不能重复设置公共属性的代码 //工厂模式出现了,创建10个Cat对象 ...
- 面向对象 继承 抽象类 接口 static 权限修饰符
Day01 面向对象 继承 抽象类 接口 static 1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出 ...
- Python之面向对象继承和派生
Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...
- javaScript面向对象继承方法经典实现
转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...
随机推荐
- Standalone集群搭建和Spark应用监控
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6815920501530034696/ 承接上一篇文档<Spark词频前十的统计练习> Spark on ...
- python 读取配置文件ini ---ConfigParser
Python读取ini文件需要用到 ConfigParser 模块 关于ConfigParser模块的介绍详情请参照官网解释:https://docs.python.org/2.7/library/c ...
- windos 安装 redis 启动闪退
本来想在linux上安装redis的,后来觉得也没必要,主要是了解使用方法,和原理,在什么平台上安装都是大同小异的 接下来简单描述下碰到的小问题:闪退和启动失败 究其原因就是端口被占用了,但是自己并没 ...
- DASCTF-Sept-X-浙江工业大学秋季挑战赛-pwn-wp
目录 DASCTF-Sept-X-浙江工业大学秋季挑战赛-pwn-wp 总结 datasystem check分析 漏洞点 利用思路 exp hehepwn 漏洞点 exp hahapwn 漏洞点 e ...
- Git命令中波浪号~与脱字符^的区别
0.前言 波浪号~,英文名叫 tilde.脱字符^,英文名叫caret. 这两种符号常见于git reset的情景,简单的项目结构和操作一般不会涉及到两者之间的区别,似乎用哪个都可以.如果遇到比较繁杂 ...
- sql多行合并一列
with a as( select * from( select 1 userId , '天津' province union select 1 userId , '北京' union select ...
- 【机器学习】HMM
机器学习算法-HMM 目录 机器学习算法-HMM 1. 模型定义 2. 序列生成 3. 概率计算 3.1 前向计算 3.2 后向计算 4. 学习 4.1 求解 4.2 求解 4.3 求解 5. 预测 ...
- 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」Broker服务端自动创建topic的原理分析和问题要点指南
前提背景 使用RocketMQ进行发消息时,一般我们是必须要指定topic,此外topic必须要提前建立,但是topic的创建(自动或者手动方式)的设置有一个开关autoCreateTopicEnab ...
- 使用TortoiseGit和Git Bash不需要输入RSA密码(passphrase)的方法
1. 安装和配置Putty 安装 官网下载Putty并安装. 生成ppk密钥 打开puttygen.exe(C:\Program Files\PuTTY\puttygen.exe), 点Convers ...
- Go 面向对象三大特性
#### Go 中面向对象的三大特性上周因为有一些事情,停更了; 停更的这段时间,花了点时间做了一个小项目(https://github.com/yioMe/node_wx_alipay_person ...