Python面向对象03 /继承
Python面向对象03 /继承
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面向对象03 /继承的更多相关文章
- python进阶03 继承
python进阶03 继承 一.继承 课堂练习:假设你正在参与一个魔幻类角色游戏的开发,公司需要腻味这个游戏设计两个角色的类: a.剑士 属性:1.角色名:2.角色等级:3.生命值:4.攻击力 行为: ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- python面向对象的继承-组合-02
*面向对象(OOP)的三大特征:**# 封装.继承.多态 继承 什么是继承 继承:# 是一种关系,描述两个对象之间什么是什么的什么的关系 例如:麦兜.佩奇.猪猪侠.猪刚鬣,都是猪 为什么要使用继承 继 ...
- python 面向对象之继承与派生
一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
- python面向对象之继承与派生
一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...
随机推荐
- qemu-guest-agent详解
qemu guest agent简称qga, 是运行在虚拟机内部的一个守护程序(qemu-guest-agent.service),他可以管理应用程序,执行宿主机发出的命令. QEMU为宿主机和虚拟机 ...
- Dubbo——SPI及自适应扩展原理
文章目录 引言 正文 一.什么是SPI? 1. Java SPI的实现 2. Dubbo SPI实现原理 由配置文件得到的猜想 SPI源码 二.自适应扩展机制 三.Dubbo IOC 总结 引言 Du ...
- cino伟斯 A770键盘界面快速设定记录后缀删除添加换行回车操作方法
http://www.cinoscan.com/upload/2016063033256485.pdf cino A770键盘界面快速设定记录后缀删除添加换行回车操作方法
- .Net Core Configuration Etcd数据源
前言 .Net Core为我们提供了一套强大的Configuration配置系统,使用简单扩展性强.通过这套配置系统我们可以将Json.Xml.Ini等数据源加载到程序中,也可以自己扩展其他形 ...
- Jmeter系列(21)- 详解 HTTP Request
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html HTTP Request 介绍 用来发 ...
- 007.OpenShift管理应用部署
一 REPLICATION CONTROLLERS 1.1 RC概述 RC确保pod指定数量的副本一直运行.如果pod被杀死或被管理员显式删除,复制控制器将自动部署相应的pod.类似地,如果运行的po ...
- loadRunnner中90%的响应时间
参考博客https://blog.csdn.net/lengyue_112/article/details/1095320?utm_source=blogxgwz4 LR在场景执行完了会出个报告,其中 ...
- C# 人脸识别库
.NET 人脸识别库 ViewFaceCore 这是基于 SeetaFace6 人脸识别开发的 .NET 平台下的人脸识别库这是一个使用超简单的人脸识别库这是一个基于 .NET Standard 2. ...
- 新来的"大神"用策略模式把if else给"优化"了,技术总监说:能不能想好了再改?
本文来自作者投稿,原作者:上帝爱吃苹果 目前在魔都,贝壳找房是我的雇主,平时关注一些 java 领域相关的技术,希望你们能在这篇文章中找到些有用的东西.个人水平有限,如果文章有错误还请指出,在留言区一 ...
- PV、UV、VV、IP的区别
PV.UV.VV.IP的区别 PV即Page View,网站浏览量 指页面的浏览次数,用于衡量网站用户访问的网页数量.用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计. 一般来说,PV ...