子类在继承的时候,在定义类时,小括号()中为父类的名字,父类的属性、方法,会被继承给子类,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. MyBatis之一对多映射查询sql配置文件。

    学生---文章的模型一对多模型 学生student.java类 package com.bjsxt.sxf.po; import java.util.Date; import java.util.Li ...

  2. python模块--os模块、sys模块

    一.os模块 1 os.getcwd() 获取当前工作的目录,即当前python脚本工作的目录路径 2 3 os.chdir("dirname") 改变当前脚本的工作目录:相当于s ...

  3. (转)Android自定义属性时format选项( <attr format="reference" name="background" /> )

    Android自定义属性时format选项可以取用的值   1. reference:参考某一资源ID. (1)属性定义: [html] view plaincopyprint? <declar ...

  4. Regexper:牛逼的 JavaScript 正则可视化工具

    RequireJS Optimizer 是 RequireJS 自带的前端优化工具,可以对 RequireJS 项目中的 JavaScript & CSS 代码使用 UglifyJS 或者 C ...

  5. Jquery each循环中中断

    在each代码块内不能使用break和continue,要实现break和continue的功能的话,要使用其它的方式 break----用return false; continue --用retu ...

  6. send函数和recv函数

    1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags );   不论是客户还是服务器应用程序都用send函数来向T ...

  7. python调试方法

    之前调试python程序都是用print参数,感觉有点弱爆啊,最近发现python也有类似C语言gdb的工具pdb,记录下pdb的使用方法和心得. 先找了段简单的测试程序: 复制代码 !/usr/bi ...

  8. svm算法 最通俗易懂讲解

    最近在学习svm算法,借此文章记录自己的学习过程,在学习很多处借鉴了z老师的讲义和李航的统计,若有不足的地方,请海涵:svm算法通俗的理解在二维上,就是找一分割线把两类分开,问题是如下图三条颜色都可以 ...

  9. 关于v9缓存的那点事

    当做好以后模块后,由于是模块原型性能不佳,故而可以用缓存方式来提升效率.缓存生成可以是模块的一个方法或者一个函数,phpcms的缓存也可以分为不同的类型,比如file,memcache.如果是file ...

  10. nginx+php产生大量TIME_WAIT连接解决办法

    问题:当启动nginx和php-fpm时,使用netstat -tunap查看到大量TIME_WAIT连接 由于不知道原因,害怕是受到攻击,马上killall nginx 和php-fpm 会不会是8 ...