子类在继承的时候,在定义类时,小括号()中为父类的名字,父类的属性、方法,会被继承给子类,Python中允许多继承。

多继承

# 父类 Master
class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方" # 实例变量,属性 def make_cake(self): # 实例方法,方法
print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) def dayandai(self):
print("师傅的大烟袋..") # 父类 School
class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方" def make_cake(self):
print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) def xiaoyandai(self):
print("学校的小烟袋..") # class Prentice(School, Master): # 多继承,继承了多个父类(School在前)
# pass # 子类 继承Master School (多继承)
class Prentice(Master, School): # 多继承,继承了多个父类(Master在前)
pass damao = Prentice()
print(damao.kongfu) # 执行Master的属性 如果重名取的是第一个父类的方法
damao.make_cake() # 执行Master的实例方法 # 子类的魔法属性__mro__决定了属性和方法的查找顺序
print(Prentice.__mro__) damao.dayandai() # 不重名不受影响
damao.xiaoyandai() # 多继承可以继承多个父类,也继承了所有父类的属性和方法
# 注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)
# 多个父类中,不重名的属性和方法,不会有任何影响。

重写父类方法及调用父类方法

# 继承父类 重写父类方法/调用父类方法

class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方" # 实例变量,属性 def make_cake(self): # 实例方法,方法
print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) class School(object):
def __init__(self):
self.kongfu = "现代煎饼果子配方" def make_cake(self):
print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) class Prentice(School, Master): # 多继承,继承了多个父类
def __init__(self):
self.kongfu = "猫氏煎饼果子配方" def make_cake(self):
print("执行子类的__init__方法前,self.kongfu属性:%s" % self.kongfu)
self.__init__() # 执行本类的__init__方法,做属性初始化 self.kongfu = "猫氏...."
print("执行子类的__init__方法前,self.kongfu属性:%s" % self.kongfu)
print("[猫氏] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) # 调用父类方法格式:父类类名.父类方法(self)
def make_old_cake(self):
# 不推荐这样访问父类的实例属性,相当于创建了一个新的父类对象
# print("直接调用Master类的kongfu属性:%s" % Master().kongfu) # 可以通过执行Master类的__init__方法,来修改self的属性值
print("执行Master类的__init__方法前,self.kongfu属性:%s" % self.kongfu)
Master.__init__(self) # 调用了父类Master的__init__方法 self.kongfu = "古法...."
print("执行Master类的__init__方法后,self.kongfu属性:%s" % self.kongfu)
Master.make_cake(self) # 调用父类Master的实例方法 def make_new_cake(self):
# 不推荐这样访问类的实例属性,相当于创建了一个新的父类对象
# print("直接调用School类的kongfu属性:%s" % School().kongfu) # 可以通过执行School类的__init__方法,来修改self的属性值
print("执行School类的__init__方法前,self.kongfu属性:%s" % self.kongfu)
School.__init__(self) # 调用了父类School的__init__方法 self.kongfu = "现代...."
print("执行School类的__init__方法后,self.kongfu属性:%s" % self.kongfu)
School.make_cake(self) # 调用父类School的实例方法 # 实例化对象,自动执行子类的__init__方法
damao = Prentice() damao.make_cake() # 调用子类的方法(默认重写了父类的同名方法) print("--" * 10)
damao.make_old_cake() # 进入实例方法去调用父类Master的方法 print("--" * 10)
damao.make_new_cake() # 进入实例方法去调用父类School的方法 print("--" * 10)
damao.make_cake() # 调用本类的实例方法

通过super()调用父类方法(如果继承多个父类,有同名方法,使用super调用会把多个父类的方法都调用一遍)

class Master(object):
def __init__(self):
self.kongfu = "古法煎饼果子配方" # 实例变量,属性 def make_cake(self): # 实例方法,方法
print("[古法] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) # 父类是 Master类
class School(Master):
def __init__(self):
self.kongfu = "现代煎饼果子配方" def make_cake(self):
print("[现代] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu)
super().__init__() # 执行父类的构造方法
super().make_cake() # 执行父类的实例方法 # 父类是 School 和 Master
class Prentice(School, Master): # 多继承,继承了多个父类
def __init__(self):
self.kongfu = "猫氏煎饼果子配方" def make_cake(self):
self.__init__() # 执行本类的__init__方法,做属性初始化 self.kongfu = "猫氏...."
print("[猫氏] 按照 <%s> 制作了一份煎饼果子..." % self.kongfu) def make_all_cake(self):
# 方式1. 指定执行父类的方法(代码臃肿)
# School.__init__(self)
# School.make_cake(self)
#
# Master.__init__(self)
# Master.make_cake(self)
#
# self.__init__()
# self.make_cake() # 方法2. super() 带参数版本,只支持新式类
# super(Prentice, self).__init__() # 执行父类的 __init__方法
# super(Prentice, self).make_cake()
# self.make_cake() # 方法3. super()的简化版,只支持新式类
super().__init__() # 执行父类的 __init__方法
print("*" * 20)
super().make_cake() # 执行父类的 实例方法
print("*" * 20)
self.make_cake() # 执行本类的实例方法 damao = Prentice()
print("-" * 20)
damao.make_cake()
print("-" * 20)
damao.make_all_cake() # print(Prentice.__mro__)

Python基础:面向对象基础(二) 继承的更多相关文章

  1. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  2. 第二十五节:Java语言基础-面向对象基础

    面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基 ...

  3. python开发面向对象基础:接口类&抽象类&多态&钻石继承

    一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...

  4. python开发面向对象基础:组合&继承

    一,组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合      人类装备了武器类就是组合 1.圆环,将圆类实例后传给圆环类 #!/usr/bin/env python #_*_ ...

  5. python 之 面向对象基础(继承与派生,经典类与新式类)

    7.2 继承与派生 7.21继承 1.什么是继承? 继承是一种新建类的的方式,在python中支持一个子类继承多个父类.新建的类称为子类或者派生类,父类又可以称为基类或者超类,子类会”遗传“父类的属性 ...

  6. python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

    python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...

  7. PYTHON开发--面向对象基础入门

    面向对象 一:面向对象初级 1.思考:首先在python中,以前我们以前用到的几乎都是函数式编程,但是有时候函数式编程其中代码重复利用率太高,我们往往会把这些重复代码写进一个函数日后去调用,所以呢,今 ...

  8. day020|python之面向对象基础2

    面向对象基础2 目录 面向对象基础2 7 对象与类型 7.1 类即类型 7.1.1 变量的三个指标 7.1.2 变量类型 7.2 list.append()方法原理 8 对象的高度整合 8.1 通过面 ...

  9. sql+PHP基础+面向对象基础简单总结

    一.MYSQL         1.配置MySql                 第一步安装服务器(apache).                 第二部安装MySql界面程序         2 ...

  10. JAVA(一)JAVA基础/面向对象基础/高级面向对象

    成鹏致远 | lcw.cnblog.com |2014-01-23 JAVA基础 1.开发环境搭建 JAVA程序的执行流程 JAVA命令->要使用一个*.class文件(类文件)->通过c ...

随机推荐

  1. express中session的存储与销毁

    1.首先在使用session之前需要先配置session的过期时间等,在入口文件app.js中 app.use(express.session({ cookie: { maxAge: config.g ...

  2. 转:Excel导入SQL数据库完整代码

    Excel导入SQL数据库完整代码 protected void studentload_Click(object sender, EventArgs e) {//批量添加学生信息 SqlConnec ...

  3. 【转】电信100M光纤无线下载速度仅为5MB/秒的困惑

    原文网址:http://itbbs.pconline.com.cn/50463999.html 在江苏电信官方测速网站测速的.1.光猫F460有线连接至笔记本,下载速度为12MB/秒左右:2.F460 ...

  4. 关于ng-class,ng-style的用法

    ng-class的使用几种方式 (1):利用双向数据绑定(className根据chang2的值去匹配类) <div class="{{className}}">... ...

  5. laravel里面使用event

    模式:大概是通过一个自定义的event,一个handler,还有一个binder,然后用来简化通知模型 生成自定义的event ./artisan make:event MyEvent 生成自定义的h ...

  6. GOF23设计模式之组合模式(composite)

    一.组合模式概述 将对象组合成树状结构以表示“部分和整体”层次结构,使得客户可以统一的调用叶子对象和容器对象. (1)组合模式的使用场景   把部分和整体的关系用树形结构来表示,从而使客户端可以使用统 ...

  7. SpringMVC-Spring-Hibernate项目搭建之三-- freemarker & 静态资源整合

    一. 前段目录结构如下架构如下: 二. freemarker文件配置 在 web.xml 文件中指定 spring 配置文件的位置 三. 配置springmvc-servlet.xml文件 1)配置自 ...

  8. 洗碗机耗材:finish 亮碟 产品的选购

    转发&补充两点 1.亮碟在国内销售的洗涤块是最低端的Classic,二合一产品(理论上必须配合软水盐和亮碟剂).国外很早就淘汰掉Classic级的洗涤块了,当前最低端的是Advanced(四合 ...

  9. 20181103_C#线程初探, BeginInvoke_EndInvoke

    在C#中学习多线程之前, 必须要深刻的理解委托; 基本上所有的多线程都在靠委托来完成 一.   进程和线程: a) 进程和线程都是计算机的概念, 跟程序语言没有任何关系 b) 进程和线程都属于计算机操 ...

  10. 【BZOJ】2819: Nim(树链剖分 / lca+dfs序+树状数组)

    题目 传送门:QWQ 分析 先敲了个树链剖分,发现无法AC(其实是自己弱,懒得debug.手写栈) 然后去学了学正解 核心挺好理解的,$ query(a) $是$ a $到根的异或和. 答案就是$ l ...