python学习 day20 (3月27日)----(单继承多继承c3算法)
继承:
提高代码的重用性,减少了代码的冗余
这两个写法是一样的
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算法)的更多相关文章
- Python 学习日志9月21日
9月21日 周四 今天是个特殊的日子吗,总感觉9月21这个日子听着怪怪的. 今天早晨看<Head First HTML and CSS>第13章节“表格和更多列表”,内容不多,看完并做了详 ...
- Python 学习日志9月20日
9月20日 周三 多大年龄了,还活得像个小孩.——急什么,人生又不长. 你习惯了思考宇宙星辰,一百年真的不长,一生也就不那么长,许多人的价值观念你也就无法理解.同样,许多人也无法理解你的价值观念,感兴 ...
- Python 学习日志9月19日
9月19日 周二 今天是普通的一天,昨天也是普通的一天,刚才我差点忘记写日志,突然想起来有个事情没做,回来写. 今天早晨学习<Head First HTML and CSS>第十一章节“布 ...
- Python学习日志9月17日 一周总结
周一,9月11日 这天写的是过去一周的周总结,我从中找出当天的内容. 这天早晨给电脑折腾装机,早晨基本上没有学习,休息了一个早晨. 下午写的上周总结,完事做mooc爬虫课的作业,<Think P ...
- python学习 day21 (3月28日)----(抽象类 多态 nametuple dump)
不要因为走的路太久了,而忘记了为了什么而出发. 提前作准备了吗?把思维导图的东西做了吗? 和工作了几年的人,相比,是不是相同的水平,如果要写简历的话. 一边学习,一边复习. 小就是大,少就是多. 1. ...
- Python学习日志9月13日
昨天的学习日志没有写,乱忙了一整天,政治电脑. 好奇心重,想要给电脑装上传说中LInux操作系统,各种小问题折腾到半夜,今天又折腾到晚上才真正的装上系统. 可是装上系统后又发现各种的不好用.虽然界面比 ...
- Python学习日志9月16日
刚才我差点睡着了,差资料的时候太费神,有些累. 今天早晨学习了<head first HTML and CSS>,今天把昨天没看了的关于字体和颜色的一章节看完了,真长.我详细的做了笔记,并 ...
- python学习 day19 (3月26日)----(对象组合)
深谙:非常透彻地了解:熟悉内中情形.谙,读作‘ān’ 熟悉. 1.面向对象作用:规划了代码中的函数处理的是哪一类问题 解决了传参的问题 方便扩展 方便重用 2.类的定义和使用类当中有哪些成员 ''' ...
- Python学习日志9月15日
一周就要过去了,而我跟一周以前没什么区别.回想一下,我这周做了什么事情呢.恍然若失.这周的精力都浪费在很多不必要的事情上了.学过一片古文,讲后羿学射箭,他有一个同学跟他一样聪明,在一起学习.后羿呢,专 ...
随机推荐
- Maven 添加jar包到本地仓库
一.使用Maven命令安装jar包 前提:在windows操作系统中配置好了Maven的环境变量,怎么配置请自己百度,这里不介绍,可参考https://jingyan.baidu.com/articl ...
- 1009 数字1的数量 数位dp
1级算法题就这样了,前途渺茫啊... 更新一下博客,我刚刚想套用数位dp的模板,发现用那个模板也是可以做到,而且比第二种方法简单很多 第一种方法:我现在用dp[pos][now]来表示第pos位数字为 ...
- [转]github详细教程
GitHub详解 GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目.它由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath ...
- PHP序列及反序列化安全漏洞
尽量阐述全PHP序列化的相关东西-.- 1.序列化和反序列化 序列化是将变量或对象转换成字符串的过程:反序列化是将字符串转换成变量或对象的过程. 序列化及反序列化常见函数:serializ ...
- 转)VCSA 6.5重启无法访问,报错“503 Service Unavailable”的解决方法
1. 问题 重启vcenter,登陆vsphere client,提示 “503 Service Unavailable (Failed to connect to endpoint: [N7Vmac ...
- [剑指Offer]6-从尾到头打印链表
典型的后进先出,可以借助栈,也可以使用递归. 考虑到若链表过长递归可能造成函数调用栈溢出,所以使用栈更好. 注意stack无遍历操作,全部用push(),pop(),top()完成. 以下创建列表胡乱 ...
- windows+nginx+tomcat实现集群负载均衡(生产环境必读)
概念理解(原文链接) 集群:多个tomcat服务器运行同一个web服务就能称之为集群 负载均衡:apache按照一定方式将不同的客户端访问分配到不同的tomcat服务器 简单负载均衡实现: 网上参考了 ...
- day 30 HTML
HTML: 超文本标记语言(Hyper Text Markup Language) Html基本结构 <!DOCTYPE html> <html> <!-- 定义HTML ...
- undefined reference to...
wj@wj-Inspiron-:~/Downloads/LBD_Descriptor/build$ cmake .. -- Configuring done -- Generating done -- ...
- python 虚拟环境操作 virtualenv +virtualenvwrapper
Window 下创建python的虚拟环境 下载工具 pip install virtualenv 创建虚拟环境目录 # 注意此命令创建的虚拟环境目录是在当前目录下 virtualenv testen ...