继承

    提高代码的重用性,减少了代码的冗余
  这两个写法是一样的

  Wa('青蛙').walk()    #青蛙 can walk
  wa = Wa('青蛙')
  wa.walk() #青蛙 can walk
1.单继承
麻烦的写法(为什么要有单继承)
  如果多个类相似的情况下(每个都写一遍有大量重复 浪费麻烦)
class Tiger(object):
def __init__(self,name):
self.name = name
def walk(self):
print('%s can walk'%self.name)
def swim(self):
print('%s can swim'%self.name)
Tiger('老虎').walk()
class Swan(object):
def __init__(self,name):
self.name = name
def walk(self):
print('%s can walk'%self.name)
def fly(self):
print('%s can fly'%self.name)
Swan('鹦鹉').fly()
class Wa(object):
def __init__(self,name):
self.name = name
def walk(self):
print('%s can walk'%self.name)
def swim(self):
print('%s can swim' % self.name)
Wa('青蛙').walk() #青蛙 can walk
wa = Wa('青蛙')
wa.walk() #青蛙 can walk
class Er(object):
def __init__(self,name):
self.name = name
def walk(self):
print('%s can walk'%self.name)
def swim(self):
print('%s can swim' % self.name)
def fly(self):
print('%s can fly'%self.name) # Er('天鹅').swim()
Er('天鹅').fly()

继承

  创建一个父类

  子类用父类的属性和方法 因为都差不多

  子类也可以新建自己特殊的属性和方法,通过super().__init__(相同元素) 和 父类名.__init__(self,相同元素)

  方法的话  自己新建 不必返回父类

class Animal(object):
def __init__(self,name,kind):
self.name = name
self.kind = kind #多了不是很好
def walk(self):
print('%s can walk'%self.name)
def swim(self):
print('%s can swim' % self.name)
def fly(self): #可以有任意个
print('%s can fly'%self.name)
class Tiger(Animal):pass
class Bird(Animal):
def __init__(self,name,kind,eyes_color): #小心 元素必须与父类相同
# super().__init__(name,kind)
# super(Bird,self).__init__(name,kind) #注意 括号前面的元素是子类 当前类 告诉父类
Animal.__init__(self,name,kind) #注意 没有括号
self.eyes_color = eyes_color #自己的属性 自己赋值
def say(self):
print("%s can say like people"%self.name)
laohu = Tiger('老虎','公') # 实参与形参一一对应 即动物的属性此对象都有 也麻烦
print(laohu.walk(),laohu.fly(),laohu.name) # 父类的方法和属性都可以用了 继承
yingwu = Bird('鹦鹉','公','blue') # 最好变量名 有意义 不是 abcd 。。。
print(yingwu.fly(),yingwu.eyes_color,yingwu.say())

多继承

引子:

各种动物,每一种动物都是一个类
青蛙、天鹅、老虎、鹦鹉
青蛙 :走,游泳
天鹅 :走,游泳,飞
老虎 :走,游泳
鹦鹉 :走,飞,说话
class FlyAnimal:
def fly(self):pass
class SwimAnimal:
def swim(self):pass
def eat():pass
class WalkAnimal:
def walk(self):pass
def eat():pass class Frog(SwimAnimal,WalkAnimal): pass
class Tiger(SwimAnimal,WalkAnimal):pass
class Swan(FlyAnimal,SwimAnimal,WalkAnimal):pass
class Parrot(FlyAnimal,WalkAnimal):
def talk(self):
pass

class Frog(SwimAnimal,WalkAnimal): pass
class Tiger(SwimAnimal,WalkAnimal):pass
class Swan(FlyAnimal,SwimAnimal,WalkAnimal):pass
class Parrot(FlyAnimal,WalkAnimal):
def talk(self):
  pass

多继承 是python语言中特有的继承方式
java语言中不支持多继承的,C# 也不支持多继承
C++支持多继承
c c++ c# java 多继承和单继承是一样的
如果对象使用名字
是子类中有的,那么一定用子类的
子类没有,可以到多个父类中去寻找
如果多个和父类都有,那么用谁的
 如果父类子类都想用,super(),父类名.方法名
算法:
1钻石继承问题

代码实现:
钻石继承问题
class A(object):
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().func() 左想
class A(object):
def func(self):
print('a',end='') class B(A):
pass
def func(self):
super().func()
print('b',end='') class C(A):
pass
def func(self):
super().func()
print('c',end='') class D(B,C):
pass
def func(self):
super().func()
print('d',end='') b = B()
b.func()
print()
d = D()
d.func()
# 在多继承中,super就只和mro顺序有关系,和父类子类没有关系了
2乌龟继承顺序

代码实现:
乌龟继承问题
class A(object):
def func(self):
print('a') class B(A):
pass
# def func(self):
# print('b') class C(A):
pass
# def func(self):
# print('c')
class D(B):
pass
# def func(self):
# print('d')
class E(C):
pass
# def func(self):
# print('e') class F(D,E):
pass
# def func(self):
# print('f')
f = F()
f.func()

过程实现:

# C3算法
# A= [AO]
# B = B ,B节点的父类对应的顺序
# B = B ,A节点顺序
# B = B ,[AO]
# 提取第一个点
# 如果从左到右第一个类,
# 在后面的继承顺序中也是第一个,或者不再出现在后面的继承顺序中
# 那么就可以把这个点提取出来,作为继承顺序中的第一个类
# B = [AO]
# BA = [O]
# B这个节点的继承顺序 :[BAO]
# C = C,[AO]
# C = [AO]
# CA = [O]
# C这个节点的继承顺序 :[CAO]
# l(D) = D + [BAO]
# D = [BAO]
# [DBAO] # l(E) = E + [CAO]
# [ECAO] # L[F] = F,[BAO],[ECAO]
# [F] = [DBAO],[ECAO]
# [FD] = [BAO],[ECAO]
# [FDB] = [AO],[ECAO]
# [FDB] = [AO],[ECAO]
# [FDBE] = [AO],[CAO]
# [FDBEC] = [AO],[AO]
# [FDBECA] = [O],[O]
# [FDBECAO]
广度优先
C3算法
99%的情况都可以用眼睛看出来
但是仍然有1%的情况是看不出来的 C3算法是怎么计算的
C3算法代码实现
class A(object):
def func(self):
print('a') class B(A):
pass
def func(self):
print('b') class C(A):
pass
def func(self):
print('c')
class F:
pass
def func(self):
print('f') class D(A,F):
pass
# def func(self):
# print('d')
class E(B,C,F):
pass
def func(self):
print('e')
class G(C,D):
pass
def func(self):
print('g')
class H(E,G):
pass
def func(self):
print('h')
print(H.mro()) # 就是帮助我们来展示c3算法的继承顺序

在python2.7中

  主动继承object才是新式类,默认是经典类
# coding:utf-8
# 新式类 继承object
# 经典类 只在py2.x中有 默认不继承object
# 多继承
# 遵循的是深度优先
class A:pass
# def func(self):
# print('a')
class B(A):
pass
# def func(self):
# print('b')
class C(A):
pass
def func(self):
print('c')
class D(B,C):pass
# def func(self):
# print('d')
d = D()
d.func()

继承总结

单继承
子类有的就用子类的
没有的就用父类的
如果父类子类都想用,super(),父类名.方法名
多继承
新式类 :
继承object
py2 要主动继承object才是新式类,默认是经典类
python2 必须 super(现在类,self) 传给父类(object)
遵循的是广度优先算法,C3算法
有super()的,super遵循mro顺序的
有mro()方法 经典类 :
不继承object
多个类之间去寻找方法的时候遵循深度优先
没有super方法
也没有mro
只在python2 中存在

人狗大战:

  继承写法

class Animal(object):
def __init__(self,name,blood,ad):
self.name = name
self.hp = blood
self.ad = ad
class Dog(Animal):
def __init__(self,name,blood,ad,kind):
super().__init__(name,blood,ad)
self.kind = kind def bite(self,person):
person.hp -= self.ad
print('%s攻击了%s,%s掉了%s点血' % (self.name, person.name, person.name, self.ad)) class Person(Animal):
def __init__(self,name,hp,ad,sex):
super().__init__(name,hp,ad)
self.sex = sex def fight(self,dog):
dog.hp -= self.ad
print('%s攻击了%s,%s掉了%s点血'%(self.name,dog.name,dog.name,self.ad)) hei = Dog('小黑',300,20,'哈士奇')
alex = Person('alex',20,1,'不详')
alex.fight(hei)
print(hei.hp)
hei.bite(alex)
print(alex.hp) # 抽象
# 继承 # 组合 :什么有什么
# 继承 :什么是什么的关系
# 先想描述的对象
# 先写出对象所对应的类
# 发现多个类之间有相同的代码
# 把相同的代码提取出来,搞成一个父类 # 先抽象,再继承
# 对象 -->类 -->基类
# 基类 -继承-> 子类 -实例化-> 对象
												

python学习 day20 (3月27日)----(单继承多继承c3算法)的更多相关文章

  1. Python 学习日志9月21日

    9月21日 周四 今天是个特殊的日子吗,总感觉9月21这个日子听着怪怪的. 今天早晨看<Head First HTML and CSS>第13章节“表格和更多列表”,内容不多,看完并做了详 ...

  2. Python 学习日志9月20日

    9月20日 周三 多大年龄了,还活得像个小孩.——急什么,人生又不长. 你习惯了思考宇宙星辰,一百年真的不长,一生也就不那么长,许多人的价值观念你也就无法理解.同样,许多人也无法理解你的价值观念,感兴 ...

  3. Python 学习日志9月19日

    9月19日 周二 今天是普通的一天,昨天也是普通的一天,刚才我差点忘记写日志,突然想起来有个事情没做,回来写. 今天早晨学习<Head First HTML and CSS>第十一章节“布 ...

  4. Python学习日志9月17日 一周总结

    周一,9月11日 这天写的是过去一周的周总结,我从中找出当天的内容. 这天早晨给电脑折腾装机,早晨基本上没有学习,休息了一个早晨. 下午写的上周总结,完事做mooc爬虫课的作业,<Think P ...

  5. python学习 day21 (3月28日)----(抽象类 多态 nametuple dump)

    不要因为走的路太久了,而忘记了为了什么而出发. 提前作准备了吗?把思维导图的东西做了吗? 和工作了几年的人,相比,是不是相同的水平,如果要写简历的话. 一边学习,一边复习. 小就是大,少就是多. 1. ...

  6. Python学习日志9月13日

    昨天的学习日志没有写,乱忙了一整天,政治电脑. 好奇心重,想要给电脑装上传说中LInux操作系统,各种小问题折腾到半夜,今天又折腾到晚上才真正的装上系统. 可是装上系统后又发现各种的不好用.虽然界面比 ...

  7. Python学习日志9月16日

    刚才我差点睡着了,差资料的时候太费神,有些累. 今天早晨学习了<head first HTML and CSS>,今天把昨天没看了的关于字体和颜色的一章节看完了,真长.我详细的做了笔记,并 ...

  8. python学习 day19 (3月26日)----(对象组合)

    深谙:非常透彻地了解:熟悉内中情形.谙,读作‘ān’ 熟悉. 1.面向对象作用:规划了代码中的函数处理的是哪一类问题 解决了传参的问题 方便扩展 方便重用 2.类的定义和使用类当中有哪些成员 ''' ...

  9. Python学习日志9月15日

    一周就要过去了,而我跟一周以前没什么区别.回想一下,我这周做了什么事情呢.恍然若失.这周的精力都浪费在很多不必要的事情上了.学过一片古文,讲后羿学射箭,他有一个同学跟他一样聪明,在一起学习.后羿呢,专 ...

随机推荐

  1. vue element upload上传、清除等

    如果项目中可以使用file-list,那我们可以点击file-list删除文件列表: 有时候项目中是不要这个文件列表的,所以在上传成功以后,文件列表一直存在,要重新上传就必须刷新页面,所以我们需要手动 ...

  2. tomcat启动闪退之内存不足及显著优化

    增大内存: 打开catalina.bat,@echo off回车输入  set JAVA_OPTS=-server -Xms256m -Xmx512m -XX:PermSize=128M -XX:Ma ...

  3. 配置eclipse+SDK+ADT开发环境

    第一步:配置jdk和eclipse环境(已完成): 第二步:ADT配置:依次点击菜单栏:help -> Install new software -> Add -> Local... ...

  4. linux cp 和scp详解

    linux之cp/scp命令+scp命令详解   名称:cp 使用权限:所有使用者 使用方式: cp [options] source dest cp [options] source... dire ...

  5. Dockerfile指令学习 (转)

    原文地址:http://blog.csdn.net/we_shell/article/details/38445979 Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一 ...

  6. echarts柱形图x轴显示不全或者每隔一个不显示的问题

    问题原因可能:x轴数据间隔太小: 问题解决: 1.调整间隔属性 xAxis: { type: 'category', //坐标轴斜着显示 axisLabel: { interval:0, rotate ...

  7. 引入flash

    调用代码 <div class="media"> <object class="main_video_box" classid="c ...

  8. 安装mysql时启动服务出错问题

    mysql安装最后一步 无法启动服务错误 博客分类: IDE问题解析     今天安装mysql程序时候,在安装到最后一步时候,在最后一步却发现无法启动服务,出现这样的提示“cannot create ...

  9. 转:css知多少(1)——我来问你来答

    1. 引言 各位前端或者伪前端(比如作者本人)的同志们,css对你们来说不是很陌生.比如我,在几年之前上大学的时候,给外面做网站就用css,而且必须用css.这样算下来也得六年多了,有些功能可能轻车熟 ...

  10. KubeletNotReady runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

    1.  mkdir -p /etc/cni/net.d 2. vi 10-flannel.conflist {  "name": "cbr0",  " ...