子类在继承的时候,在定义类时,小括号()中为父类的名字,父类的属性、方法,会被继承给子类,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__)

最新文章

  1. .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
  2. TestNG @Factory与 @DataProvider 结合使用进行参数化测试
  3. DotNet Core 1.0 集成 CentOS 开发与运行环境部署
  4. Sqlite学习笔记(一)&amp;&amp;编译安装
  5. 在Yii用createUrl中明明白白生成网址
  6. golang初体验
  7. bmp to jpg
  8. unix进程的环境--unix环境高级编程读书笔记
  9. MySQL 全角转换为半角
  10. LabVIEW中开放隐藏属性的inikey
  11. axios 用法简介(转载)
  12. # 2019-2020.3 《java程序设计》第一周学习总结
  13. SQLite中的SELECT子句
  14. 【平差软件学习---科傻】四、科傻二等水准平差(参数设置和in1文件讲解)
  15. MySQL实现排名并查询指定用户排名功能
  16. [android] WebView自定义浏览器
  17. vue2.* 事件结合双向数据绑定、模块化以及封装Storage实现todolist 待办事项 已经完成 和进行中持久化 06
  18. Solr4:查询参数fq的用法(对结果进行过滤;两组关键词组合查询)
  19. C# DataGridView在单元格提示里(ToolTip)显示完整的单元格内容
  20. word调整技巧

热门文章

  1. ALTERA的FPGA命名规则
  2. Quick 3.3 final 加载ccs的变化
  3. bzoj 3996 [TJOI2015]线性代数——最小割
  4. vs2017 xamarin导入jar,SO文件的问题
  5. TCP/IP概念简述
  6. Sql Server 2012 存储过程的调试
  7. C#如何:启用和禁用自动绑定重定向 (微软)
  8. CodeForces - 963B Destruction of a Tree (dfs+思维题)
  9. kotlin学习一:kotlin简介
  10. 10g RAC常用开启关闭命令 – SRVCTL用法