python 面向对象专题(三):继承
1. 初识继承
- 概念:专业角度:如果B类继承A类,B类就称为子类,派生类,A类就称为父类,超类,基类
- 种类:单继承,多继承
- 面向对象的三大特征:继承,封装,多态
- 继承的优点:
- 减少重复的代码
- 增加类之间的耦合性(不宜多,宜精)
- 使代码更清晰,合理化
2. 单继承
定义:只有一个父类
执行父类的属性和方法:
1.类名执行父类的属性和方法
2.派生类对象执行父类的属性和方法
1.查询顺序:
单向不可逆,子类可以使用父类的属性和方法,父类不可以使用子类的属性和方法 2.实例化对象时必须执行
__init__方法,类中没有,从父类找,父类没有,从object类中找。既要执行子类的方法,又要执行父类的方法
方法一:不依赖继承 / 父类.func(对象,其他参数)
class Animal(object):
type_name = "动物类"
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print("吃东西")
class Person(Animal):
def __init__(self,name,sex,age,mind):
Animal.__init__(self,name,sex,age)
self.mind = mind
def eat(self):
super().eat()
print(f'{self.name}会吃饭') p1 = Person("张三","男",18,"有思想")
p1.eat()方法二:依赖继承 / 利用super
class Aniaml(object):
type_name = '动物类'
def __init__(self,name,sex,age):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print('吃东西')
class Person(Aniaml):
def __init__(self,name,sex,age,mind):
{super(Person,self).__init__(name,sex,age)} (完整写法)
super().__init__(name,sex,age)
self.mind = mind
def eat(self):
super().eat()
print('%s 吃饭'%self.name)
class Cat(Aniaml):
pass
p1 = Person('张三','男',18,'有思想')
print(p1.__dict__) # 利用super,super().func(参数)
# super.__init__执行父类
# 执行父类的__init__方法,重构父类方法.单继承应用示例:
class Base:
def __init__(self,num):
self.num = num
def func1(self):
print(self.num)
self.func2()
def func2(self):
print(222,self.num)
class Foo(Base):
def func2(self):
print(222,self.num)
lst = [Base(1),Base(2),Foo(3)]
for obj in lst:
obj.func1() # 结果:
1
222 1
2
222 2
3
222 3单继承总结:
- 面向对象中super的作用:
super().func(参数) 重构父类的方法,严格按照对象从属类的mro顺序执行
3. 多继承
Python类分为两种:
经典类:不继承object类,深度优先原则,深度优先.从左至右,深度优先.
新式类:继承object类,mro(C3)算法(新式类查询顺序)Python2x:Python2.2之前都是经典类,Python2.2之后,经典类和新式类共存
Python3x:全都是新式类,如果基类谁都不继承,那这个类会默认继承object类新式类推导示例:
class O:
name = '张三' class D(O):
pass class E(O):
name = '李四'
# pass
class F(O):
name = '王五' class B(D,E):
pass class C(E,F):
pass class A(B,C):
pass obj = A()
print(obj.name) # mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
# mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C]) '''
mro(A(B,C)) = [A] + merge(mro(B),mro(C),[B,C]) mro(B(D,E)) = [B] + merge(mro(D),mro(E),[D,E]) mro(B(D,E)) = [B] + merge([D,O],[E,O],[D,E])
mro(B(D,E)) = [B,D] + merge([O],[E,O],[E])
mro(B(D,E)) = [B,D,E] + merge([O],[O])
mro(B(D,E)) = [B,D,E,O] mro(C) = [C,E,F,O] mro(A(B,C)) = [A] + merge([B,D,E,O],[C,E,F,O],[B,C])
= [A,B] + merge([D,E,O],[C,E,F,O],[C])
= [A,B,D] + merge([E,O],[C,E,F,O],[C])
= [A,B,D,C] + merge([E,O],[E,F,O])
= [A,B,D,C,E] + merge([O],[F,O])
= [A,B,D,C,E,F,O]
''' # print(A.mro())经典类推导示例:见下面示例
4. 总结
类的静态属性,如果指向一个可变数据类型,对象或者类名都可以给这个可变数据类型内部增,删,改,查(不可以对其整体增,删,改,查)
示例代码:
class A:
name = []
p1 = A()
p2 = A()
p1.name.append(1)
# p1.name,p2.name,A.name 分别是什么?
# 结果:[1],[1],[1]新式类,经典类示例
class A:
pass
class B(A):
pass
class C(A):
pass
class D(A):
pass
class E(B, C):
pass
class F(C, D):
pass
class G(D):
pass
class H(E, F):
pass
class I(F, G):
pass
class K(H, I):
pass
# 如果这是经典类,请写出他的继承顺序。
KHEBACFDIG # 如果这是新式类,请写出他的继承顺序,并写出具体过程。
KHEBIFCGDA
python 面向对象专题(三):继承的更多相关文章
- Python面向对象中的继承、多态和封装
Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...
- python 面向对象专题(十):特殊方法 (三)__get__、__set__、__delete__ 描述符(三)方法是描述符
在类中定义的函数属于绑定方法(bound method),因为用户定义的函数都有 __get__ 方法,所以依附到类上时,就相当于描述符.示例 20-13 演示了从 面向对象专题(九)示例 20-8 ...
- python面向对象(三)之继承
继承 介绍 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.继承即常说的is-a关系.子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承 ...
- python 面向对象专题(一):面向对象初识、面向对象结构、类、self、实例化对象
https://www.cnblogs.com/liubing8/p/11301344.html 目录 Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 1. 面向对象 ...
- Python面向对象之类的继承(2)
1.除了封装,Python面向对象还有继承这一功能,如下代码,这是简单的继承功能. class Animal: def chi(self): print(self.name+' 吃') def he( ...
- python 面向对象专题(七):异常处理
目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 2.try 6. 常见异常种类 1. ...
- python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法
目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...
- python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass
https://www.cnblogs.com/liubing8/p/11325421.html 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubc ...
- python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super
https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...
随机推荐
- 《ElasticSearch入门》一篇管够,持续更新
一.顾名思义: Elastic:灵活的:Search:搜索引擎 二.官方简介: Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTf ...
- 【环境安装】Docker安装
[环境安装]Docker安装 CentoOS-7 安装步骤: 1.卸载已经安装的Docker sudo yum remove docker \ docker-client \ docker-clien ...
- 这一次搞懂Spring事务是如何传播的
文章目录 前言 正文 事务切面的调用过程 事务的传播性概念 实例分析 总结 前言 上一篇分析了事务注解的解析过程,本质上是将事务封装为切面加入到AOP的执行链中,因此会调用到MethodIncepto ...
- 浅谈async 及 await
async 及 await 涉及面试题:async 及 await 的特点,它们的优点和缺点分别是什么?await 原理是什么? 一个函数如果加上 async ,那么该函数就会返回一个 Promise ...
- cb15a_c++_vector容器的自增长_每次增加百分之50
cb15a_c++_vector容器的自增长_每次增加百分之50每次自动容量代销扩充,增加百分之50_for windows C++,vector是用数组做出来的->数组的缺点和优点优点:具有下 ...
- 测试人员遇到Android APP崩溃和无响应手足无措?
这2天,在测APP兼容性时,遇到APP奔溃闪退的情况.将问题反馈给开发后,开发自己调试后,没有复现.由于又是远程,base地不在一块,我总不能把手机寄过去吧,那也太费事了. 所以就想到,提供明确的报错 ...
- 如何从OutLook正确取得定期会议的时间?(待解决)
背景: 用Microsoft.Office.Interop.Outlook取得日历项,然后根据业务要求筛选. 现象: 如果是定期会议,使用AppointmentItem.Start/End取得的是该定 ...
- 提交代码到gitbub.com
提交代码到gitbub.com touch README.md //新建说明文件 git init //在当前项目目录中生成本地git管理,并建立一个隐藏.git目录 git add . //添加当前 ...
- Java工具类—包装类
Java工具类--包装类 我们都知道,JDK 其实给我们提供了很多很多 Java 开发者已经写好的现成的类,他们其实都可以理解成工具类,比如我们常见的集合类,日期相关的类,数学相关的类等等,有了这些工 ...
- CLR垃圾收集器
CLR GC是一种引用跟踪算法,大致步骤如下: 1.暂停进程中所有的线程: 2.标记阶段,遍历堆中的所有对象,标记为删除,然后检查所有活动根,如果有引用对象,就标记那个对象可达,否则不可达: 3.GC ...