python面向对象 : 继承
一. 初识继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类.
当我们在定义多个类的时候,发现要用到相同的方法或变量,如果每个类都要写相同的方法和变量,那么代码就会重复,为了减少代码,可以用继承来解决.
# 三个类中都有相同的参数,造成代码重复 class Person:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Cat:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age class Dog:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
用继承的思想来做
class Animal:
animal = '动物'
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age def hobby(self):
print('%s喜欢吃' % self.name) class Person(Animal): #继承Animal类
pass
class Cat(Animal):
pass
class Dog(Animal):
pass print(Person.animal) #动物 类名可以访问父类所有内容
p = Person('jack', '男', 25)
p.hobby() #jack喜欢吃
# 子类以及子类实例化的对象 可以访问父类的任何方法或变量.先从本类中找hobby方法,找不到则从父类里找
既要执行子类的方法,又要执行父类的方法? 有两种解决方法.
1,Animal.__init__(self, name, sex, age)
2,super().__init__(name,sex,age)
class Animal:
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age def eat(self):
print('%s会吃' % self.name) def drink(self):
print('%s会喝' % self.name) class Bird(Animal):
def __init__(self, name, sex, age, wing):
# super().__init__(name, sex, age ) #自动把self传给父类
Animal.__init__(self, name, sex, age)
self.wing = wing def egg(self):
print('鸡会下蛋') def eat(self): #本类含有和弗雷相同的方法名
super().drink() #用super()调用父类的方法
print('鸟会吃虫子') b = Bird('鸟', '公', 30, '翅膀')
print(b.__dict__) # {'name': '鸟', 'sex': '公', 'age': 30, 'wing': '翅膀'}
b.eat()
# 鸟会喝 #执行父类的eat方法
# 鸟会吃虫子 #执行本类的eat方法
二. 继承的进阶
1. 单继承和多继承
class A:
pass
class B(A): #单继承
pass
class C(A):
pass
class D(B,C): #多继承
pass
2. 经典类, 新式类
新式类: 凡是继承object类都是新式类. python3x 所有的类都是新式类,因为python3x中的类都默认继承object.
经典类: 不继承object类都是经典类, python2x:(既有新式类,又有经典类) 所有的类默认都不继承object类,所有的类默认都是经典类.你可以让其继承 object.
单继承: 新式类,经典类查询顺序一样.
多继承继承顺序(讨论的是继承两个类):
新式类: 遵循广度优先 : 一条路走到倒数第二级,判断,如果其他路能走到终点,则返回走另一条路.如果不能,则走到终点. 可以用mro()来查询继承顺序.
经典类: 遵循深度优先 : 一条路走到底.
class A:
def func(self):
print('IN A') class B(A):
# pass
def func(self):
print('IN B') class C(A):
# pass
def func(self):
print('IN C') class D(B):
# pass
def func(self):
print('IN D') class E(C):
def func(self):
print('IN E') class F(D,E):
# pass
def func(self):
print('IN F') f1 = F()
f1.func() #IN F print(F.mro()) # 查询类的继承顺序
# [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>,
# <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
3. 多继承原理: MRO_C算法
mro(): 查询类的继承顺序. 代码和步骤如下:
class H:
pass class G(H):
pass class F(H):
pass class E(G):
pass class D(F):
pass class C(E):
pass class B(D):
pass class A(B, C, D):
pass print(A.mro()) '''
首先找到A继承的三个类的深度继承顺序,放到一个列表中 B [B,D,F,H]
C [C,E,G,H]
D [D,F,H] 每个列表的第一个元素为头部,其它位置元素都为尾部,从第一个列表的头部开始找,找其他列表中尾部是否含有
这个类名,如果没有,提取出来放到一个列表中,如果有,找下一个列表的头部,循环下去
只要提取来一个,我们就从第一个列表的头部接着重复上面的操作. A [A][B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D] A #找到第一个列表的头A,其他列表尾部没有A,把A取出来,如果其他列表的头部有A则剔除
[][B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D] B
[][D,F,H] [C,E,G,H] [D,F,H] [C,D] C
[][D,F,H] [E,G,H] [D,F,H] [D] D
[][F,H] [E,G,H] [F,H] [] F
[][H] [E,G,H] [H] [] E #找到第一个列表的头部H,但是其他列表尾部有H,所以跳过这个列表,去下一个列表取头部
[][H] [G,H] [H] [] G
[][H] [H] [H] [] H
[][] [] [] []
lst = [A,B,C,D,F,E,G,H]
'''
class F:
pass class E:
pass class D:
pass class C(D, F):
pass class B(E, D):
pass class A(B, C):
pass print(A.mro())
'''
首先找到A继承的两个类的深度继承顺序
把B作为子类,找出B类的查询顺序 B [B] [E] [D] [E,D] B
[] [E] [D] [E,D] E
[] [] [D] [D] D
[] [] [] []
lst = [B,E,D]
把C作为子类,找出C类的查询顺序 C [C] [D] [F] [D,F] C
[] [D] [F] [D,F] D
[] [] [F] [F] F
[] [] [] []
lst = [C,D,F] A [A] [B,E,D] [C,D,F] [B,C] A
[] [B,E,D] [C,D,F] [B,C] B
[] [E,D] [C,D,F] [C] E
[] [D] [C,D,F] [C] C
[] [D] [D,F] [] D
[] [] [F] [] F
[] [] [] []
lSt = [A,B,E,C,D,F]
'''
python面向对象 : 继承的更多相关文章
- python 面向对象 继承 派生 组合
具体参考博客:http://www.cnblogs.com/linhaifeng/articles/6182264.html#_label12 一.面向对象 面向对象:对象与对象之间的相互交互,不可预 ...
- Python面向对象-继承和多态特性
继承 在面向对象的程序设计中,当我们定义一个class时候,可以从现有的class继承,新的class成为子类,被继承的class称为基类,父类或超类. 比如,编写一个名为Animal的class: ...
- Python面向对象继承案例
面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 继承 实现代码的重用,相同的代码不需要重复的编写 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活 ...
- Python 面向对象--继承,实现,依赖,关联,聚合,组合
一. 继承 继承指的是子类继承父类除私有内容以外的其他所有内容, 并且子类具有增加自己新内容的能力. 举例说明: class Animal: print("吃是动物的本能") cl ...
- Python面向对象 -- 继承和多态、获取对象信息、实例属性和类属性
继承和多态 继承的好处: 1,子类可以使用父类的全部功能 2,多态:当子类和父类都存在相同的方法时,子类的方法会覆盖父类的方法,即调用时会调用子类的方法.这就是继承的另一个好处:多态. 多态: 调用方 ...
- Python面向对象----继承, 重载
1. 面向对象三大特性之继承. 继承的便捷是子类可以直接调用父类里面的方法和属性.(在强类型语言里面是只能调用公有成员), 不用重复的造轮子. 减少程序猿的负担.实现多态等上层结构 2. 父类代码 3 ...
- python 面向对象 继承
什么是继承 继承表达的是一种”是“的关系,比如人是动物 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 继承是基于抽象的结 ...
- python面向对象继承
class A(object):pass # 括号中可称为父类,基类,超类 class B:pass # 父类,基类,超类 class A_son(A,B):pass # 子类,派生类 class A ...
- 028.Python面向对象继承(单继承,多继承,super,菱形继承)
一 继承的概念 种类 单继承 多继承 至少两个类: 子类:一个类继承另外一个类,那么该类是子类(也叫作衍生类) 父类:另外一个,这个被继承的类,叫做父类(也叫作超类),object 在python中 ...
随机推荐
- 【HAOI2011】 向量
数论好劲啊 原题: 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出 ...
- django+uwsgi+nginx数据表过大引起"out of memory for query result"
昨天负责的一个项目突然爆“out of memory for query result”. 背景 项目的数据表是保存超过10m的文本数据,通过json方式保存进postgres中,上传一个13m的大文 ...
- MySQL DataType--字符串类型
================================================= VARCHAR类型存储空间问题 当MySQL表使用ROW_FORMAT=FIXED时,对于定义VAR ...
- Cassandra如何保证数据最终一致性
Cassandra如何保证数据最终一致性:1.逆熵机制(Anti-Entropy)使用默克尔树(Merkle Tree)来确认多个副本数据一致,对于不一致数据,根据时间戳来获取最新数据. 2.读修复机 ...
- nginx ssi + ngx_pagespeed 实现micro frontends 开发
nginx 的ssi 功能让我们可以将不同的拼接起来,ngx_pagespeed 是pagespeed 的nginx 模块,可以帮助 我们解决前端的一些性能优化的问题,通过简单的配置就可以搞定 一张参 ...
- graalvm 简单试用
安装 地址 http://www.graalvm.org/downloads/ 配置环境变量 linux: export PATH=/path/to/graalvm/bin:$PATH mac: ...
- 你不知道的JavaScript(下卷) (Kyle Simpson 著)
第一部分 起步上路 第1章 深入编程 1.1 代码 1.2 表达式 1.3 实践 1.3.1 输出 1.3.2 输入 1.4 运算符 1.5 值与类型 1.6 代码注释 1.7 变量 1.8 块 1. ...
- Python列表生成器
本篇将介绍python生成器,更多内容请参考:python学习指南 前言 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不 ...
- css重难点笔记
只有定位(static除外)的盒子才有z-index,即对静态定位,文档流和浮动设置z-index,都是无效的. 一个盒子如果未给宽度,那么被浮动,绝对定位,display:inline-block之 ...
- 适配器(Adapter)
Adapter:将一个Class的接口转换成另一个Class的接口,使原本因接口不兼容而不能合作的Class可以一起运作.主要有两种:迭代器适配器(Iterator Adpater)和容器适配器(Co ...