跟老齐学Python之编写类之四再论继承


Posted in Python onOctober 11, 2014

在上一讲代码的基础上,做进一步修改,成为了如下程序,请看官研习这个程序:

#!/usr/bin/env python

#coding:utf-8
class Person:

    def __init__(self, name, email):

        self.name = name

        self.email = email
class Programmer(Person):

    def __init__(self, name,email,lang, system, website):

        Person.__init__(self,name,email)

        self.lang = lang

        self.system = system

        self.website = website
class Pythoner(Programmer):

    def __init__(self,name,email):

        Programmer.__init__(self,name,email,"python","Ubuntu","qiwsir.github.io")
if __name__=="__main__":

    writer = Pythoner("qiwsir","qiwsir@gmail.com")

    print "name=",writer.name

    print "lang=",writer.lang

    print "email=",writer.email

    print "system=",writer.system

    print "website=",writer.website
#运行结果
name= qiwsir

lang= python

email= qiwsir@gmail.com

system= Ubuntu

website= qiwsir.github.io

 对结果很满意,再看程序中的继承关系:Pythoner <-- Programmer <-- Person,从上面的过程中不难看出,继承能够减少代码重复,是的代码更简练。另外,在继承的时候,也可以在函数中对参数进行默认赋值。

为了能够突出继承问题的探究,还是用那种简单的类来做实验。

多余的B

#!/usr/bin/env python

#coding:utf-8
class A:

    def __init__(self):

        print "aaa"
class B(A):

    pass
if __name__=="__main__":

    a = A()

    b = B()
#运行结果
aaa

aaa

 B继承A,没有任何修改地继承,B就可以不用写任何东西了,或者说B本质上就是一个多余。在真实的编程过程中,没有这样写的,这里仅仅是为了向看官展示一下继承的含义罢了。

##首个继承有效
#!/usr/bin/env python

#coding:utf-8
class A:

    def __init__(self):

        print "aaa"
class B:

    def __init__(self):

        print "bbb"
class C1(A,B):

    pass
class C2(B,A):

    pass
if __name__=="__main__":

    print "A--->",

    a = A()

    print "B--->",

    b = B()

    print "C1(A,B)--->",

    c1 = C1()

    print "C2(B,A)--->",

    c2 = C2()
#运行结果
A---> aaa

B---> bbb

C1(A,B)---> aaa

C2(B,A)---> bbb

 列位看官是否注意了,类C1继承了两个类A,B;类C2也继承了两个类,只不过书写顺序有点区别(B,A)。从运行结果可以看出,当子类继承多个父类的时候,对于构造函数__init__(),只有第一个能够被继承,第二个就等掉了。所以,一般情况下,不会在程序中做关于构造函数的同时多个继承,不过可以接力继承,就如同前面那个比较真实的代码一样。

其它方法的继承

#!/usr/bin/env python

#coding:utf-8
class A:

    def __init__(self):

        print "aaa"

    def amethod(self):

        print "method a"
class B(A):

    def __init__(self):

        print "bbb"


if __name__=="__main__":

    print "A--->"

    a = A()

    a.amethod()

    print "B--->"

    b = B()

    b.amethod()
#运行结果
A--->

aaa

method a

B--->

bbb

method a

 为了说明白上面的情况,还是画了一张图,不过,我画完之后,就后悔了,看这张图好像更糊涂了。怎么着也画了,还是贴出来,如果能够协助理解更好了。

跟老齐学Python之编写类之四再论继承

A的实例和调用,就不多说了。重点看B,类B继承了A,同时,B在构造函数中自己做了规定,也就是B的构造函数是按照B的意愿执行,不执行A的内容,但是,A还有一个amethod(self)方法,B则继承了这个方法。当通过类B的实例调用这个方法的时候,就能够成功了:b.amethod()

这就是方法的继承和调用方法。

所谓继承,就是从下到上一级一级地找相应的继承对象,找到了就继承之。如果有同名的怎么办?按照什么顺序找呢?

应用网上的一段:

在Python中,可以?行多重?承,????r候要注意搜?さ捻?序,是?淖宇??e?始,接著是同一??痈割??e由左至右搜?ぃ?僦粮??油?浑A?痈割??e由左至右搜?ぃ?钡竭_到???橹埂?/p>

代码举例:

class A(object):

    def method1(self):

        print('A.method1')
    def method2(self):

        print('A.method2')
class B(A):

    def method3(self):

        print('B.method3')
class C(A):

    def method2(self):

        print('C.method2')
    def method3(self):

        print('C.method3')
class D(B, C):

    def method4(self):

        print('C.method4')
d = D()

d.method4() # 在 D 找到,C.method4

d.method3() # 以 D->B ?序找到,B.method3

d.method2() # 以 D->B->C ?序找到,C.method2

d.method1() # 以 D->B->C->A ?序找到,A.method1

 务必请真正的学习者要对照每个类的每个方法,依次找到相应的输出结果。从而理解继承的顺序。学习,就要点滴积累。

Python 相关文章推荐
Python创建xml的方法
Mar 10 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
Jan 15 Python
OpenCV-Python 摄像头实时检测人脸代码实例
Apr 30 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
python深copy和浅copy区别对比解析
Dec 26 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
python中if嵌套命令实例讲解
Feb 25 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 Python
Python函数中apply、map、applymap的区别
Nov 27 Python
Python使用MySQLdb for Python操作数据库教程
Oct 11 #Python
跟老齐学Python之编写类之三子类
Oct 11 #Python
跟老齐学Python之编写类之二方法
Oct 11 #Python
Python中MYSQLdb出现乱码的解决方法
Oct 11 #Python
python操作mysql中文显示乱码的解决方法
Oct 11 #Python
wxPython窗口中文乱码解决方法
Oct 11 #Python
跟老齐学Python之编写类之一创建实例
Oct 11 #Python
You might like
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
浅谈php自定义错误日志
2015/02/13 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
2014/04/06 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
jquery中radio checked问题
2015/03/16 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
python编程使用协程并发的优缺点
2018/09/20 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
详解Python:面向对象编程
2019/04/10 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
服务理念口号
2014/06/11 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
简历中自我评价范文
2015/03/11 职场文书
大学生读书笔记范文
2015/07/01 职场文书