Python进阶(十五)----面向对象之~继承

一丶面向对象的三大特性:封装,继承,多态

二丶什么是继承

# 什么是继承
# b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类
# b类或者b对象 能够使用 a类的所有属性和方法 # 为什么要有继承
由子类继承父类,从而完成了对子类功能的扩展 #第一:
子类对父类的继承是全部的公有和受保护的继承,这使得子类可能继承了对子类无用甚至有害的父类的方法。换句话说,子类只希望继承父类的一部分方法,怎么办?
#第二:
实际的对象千变万化,如果每一类的对象都有他们自己的类,尽管这些类都继承了他们的父类,但有些时候还是会造成类的无限膨胀。
#第三:
继承的子类,实际上需要编译期确定下来,这满足不了需要在运行内才能确定对象的情况。而组合却可以比继承灵活得多,可以在运行期才决定某个对象。
#摘自: hivon博主 # 总结:
# 对类的功能的扩展,要多用组合,少用继承。

三丶继承的优缺点

#优点:
#1.节省代码, 2.增强耦合性 , 3. 代码规范化 , 4 .重构父类方法 #缺点:
# 继承关系会造成 高耦合性

转一篇关于 继承 优缺点的文章

四丶单继承

## 单继承
class Animal:
live = '活着' def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age def eat(self):
print('in eat function') class Person(Animal):
pass ### 1. 子类以及对象 可以调用父类的方法和属性 print(Person.live) # 子类名.父类中的属性 , 查看或获取父类中的变量
Person.eat('d') # 子类名.父类中的方法,调用父类的方法
print(Person.__dict__) # 查看 子类中 存在的属性 ### 2. 从对象执行父类的一切.
# 实例化对象一定一定会执行三件事. 一定会执行__init__
p1 = Person('ly', '男', '21')
print(p1.live) # 对象调用 类中的属性
p1.eat() # 对象 调用类中的方法
print(p1.__dict__) # 查看 p1对象的属性 Person.live = 'xxx'
print(Person.live) # 注意: 子类以及子类对象,只能调用父类的属性以及方法 , 不能操作增删改 ## 单继承super的使用 ,
class Animal:
live = '活着'
def __init__(self, name, sex, age): # self 接收的 p1 对象内存空间,给p1封装属性
self.name = name
self.sex = sex
self.age = age def eat(self):
print('in 父类 eat function') class Person(Animal):
def __init__(self,name,age,sex,hobby): # 给p1 封装 hobby属性 # Animal.__init__(self,name,age,sex) # 执行父类的 __init__方法 , self 是当前p1 对 .
# super(Person, self).__init__(name,sex,age)
super().__init__(name,sex,age) #执行父类 __init__方法 self.hobby=hobby def eat(self):
print('子类吃')
super().eat() p1=Person('ly','33','人妖','服务')
p1.eat()
print(p1.__dict__) #打印p1对象中的属性, 父类定义的属性, 和子类自定义的属性 都存在

五丶多继承

python 2.2 之前: 都是经典类

class A:		# 经典类    不继承object类
pass

python 2.2 直至 python2.7 之间存在两种类型:经典类,新式类

  经典类:

      基类不继承object ,查询规则:依靠深度优先(先深入继承树左侧查找,然后再返回,开始查找右侧)

  新式类:

      必须继承object , 查询规则: MRO算法

class A:		# 经典类
pass class B(object): #新式类
pass

python3x 只有新式类

class B(object): 	# 新式类   , (object) 默认可以不写    继承object类
pass ### 多继承案例
class ShenXian: # 神仙
def fei(self):
print("神仙都会⻜")
class Monkey: # 猴
def chitao(self):
print("猴⼦喜欢吃桃⼦")
class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是⼀只猴
pass
sxz = SunWukong() # 孙悟空
sxz.chitao() # 会吃桃⼦
sxz.fei() # 会⻜

​ 多继承的难点就是继承顺序的问题

       MRO算法:

#### 新式类 继承关系的运算
### mro算法
# 公式:
# mro(Child(Base1,Base2)) = [ Child ] + merge( mro(Base1), mro(Base2), [ Base1, Base2] )
# mro(Foo(H,G)) = [Foo] + merge(mro(H), mro(G),[H,G]) # 表头:
#   列表的第一个元素
# 表尾:
#   列表中表头以外的元素集合(可以为空)
# 表头,表尾
# [A,B,C] : 表头: A 表尾: [B,C]
# [A] : 表头: A 表尾: [] # +操作
# [A] + [B] = [A, B] class O:
pass class D(O):
pass class E(O):
pass class F(O):
pass class B(D,E):
pass class C(E,F):
pass class A(B,C):
pass a = A() #### 方式一 套用公式
'''
mro(A(B,C))=[A] + merge(mro(B) , mro(C)), [B,C] # merge(mro(B) , mro(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] + merge([O])
=[A,B,D,C,E,F,O] mro(B(D,E))=[B] + merge(mro(D),mro(E)), [D,E] # C3算法, merge操作是C3算法的核心。
=[B] + merge([D]+[O],[O] ,[E]+[O],[O]),[D,E] # 公式拆解,
=[B] + merge([D,O],[E,O]),[D,E]
=[B,D] + merge([O],[E,O]),[E]
=[B,D,E] + merge([O])
=[B,D,E,O] mro(C[E,F])=[C] + merge(mro(E),mro(F)),[E,F]
=[C] + merge([E]+megre([O]),[F]+megre([O])),[E,F]
=[C] + merge([E,O],[F,O]) ,[E,F]
=[C,E] + merge([O],[F,O]),[F]
=[C,E,F] + merge([O],[O])
=[C,E,F,O]
''' #### 方式二 使用 mro()
print(A.mro()) # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.F'>, <class '__main__.O'>, <class 'object'>]

Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)的更多相关文章

  1. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  2. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  3. J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式

    J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式   反向工程又称逆向工程.   开发项目涉及到的表太多,一个一个的写JAVA实体类很是费事.MyEcl ...

  4. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  5. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

  6. 孤荷凌寒自学python第十五天python循环控制语句

    孤荷凌寒自学python第十五天python循环控制语句 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) python中只有两种循环控制语句 一.while循环 while 条件判断式 1: ...

  7. Python进阶(十四)----空间角度研究类,类与类之间的关系

    Python进阶(十四)----空间角度研究类,类与类之间的关系 一丶从空间角度研究类 对象操作对象属性 class A(): address = '沙河' def __init__(self, na ...

  8. Python进阶(十二)----re模块

    Python进阶(十二)----re模块 一丶re模块 ​ re模块是python将正则表达式封装之后的一个模块.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. #正则表达式: ...

  9. Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)

    Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型) 一丶软件开发规范 六个目录: #### 对某 ...

随机推荐

  1. Java将list<map>或者list<entity>集合根据指定字段排序

    今天项目中用到了,特记录一下 一. List<Map> 如果 item.get(sortField) 有时间,有数字的时候直接toString(),数组结果的排序结果可能不正确 List& ...

  2. 关于用maven创建的springboot工程打包jar后找不到配置文件的问题

    你的resources文件夹的名称写错了!!! 如果不在pom中配置build的资源路径,那么你的资源文件名必须默认是“resources”! 解决办法有两个: 1.修改文件夹名称 2.添加pom的b ...

  3. java中过滤器(Filter)与拦截器(Interceptor )区别

    过滤器(Filter) Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是设置字符集.控制权限.控制转向.做一些业务逻辑判断等.其工作 ...

  4. 解决git 出现 Your account has been blocked问题

    使用git 出现 Your account has been blocked 无法从远程pull代码下来, 解决方案如下: $ git push origin masterGitLab: Your a ...

  5. Heartbeat took longer than "00:00:01" at "09/06/2019 05:08:08 +00:00".

    .netcore在k8s+docker+linux,部署后,偶尔会报这样的警告 Warn:Microsoft.AspNetCore.Server.KestrelHeartbeat took longe ...

  6. python while 1 然后pass会发生什么?

    下面的代码,会使32核linux服务器志强e5的cpu使用率达到3200%,然后别的什么程序都跑不了. 如果windows,cpu使用率会达到100%.这是计算方式有点区别. 个人计算机,除非你是8路 ...

  7. 关于linux新建用户并赋予文件夹权限和scp权限的问题

    当前用户是aaa,新建用户bbb: $adduser bbb 赋予sudo权限(即把用户bbb添加到sudo组):$usermod -a -G sudo bbb 切换到bbb:$su - bbb 假设 ...

  8. C++内存管理5-处理new分配内存失败情况(转)

    C++内存管理5-处理new分配内存失败情况(转) endl; 参考博客: https://www.cnblogs.com/findumars/p/9905195.html

  9. Centos各版本系统ISO镜像下载地址

    https://www.centos.org/download/mirrors/ 需要在里面一个个看,有些是没有旧版本镜像的 补充: 上面这个方法很难再找到旧版本了 更好的方法如下:以下载Centos ...

  10. kafka安装linux版

    安装实战 kafka安装包下载(注意:这里选择的安装包是2.11系列的1.1.0版本的) wget https://archive.apache.org/dist/kafka/1.1.0/kafka_ ...