跟老齐学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 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
java直接调用python脚本的例子
Feb 16 Python
在Python的框架中为MySQL实现restful接口的教程
Apr 08 Python
python实现比较两段文本不同之处的方法
May 30 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
Python unittest基本使用方法代码实例
Jun 29 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
python 实现性别识别
Nov 21 Python
教你怎么用python实现字符串转日期
May 24 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
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
js表数据排序 sort table data
2009/02/18 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
vue实现分页栏效果
2019/06/28 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
[27:02]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第三场
2014/05/24 DOTA
Python 的 with 语句详解
2014/06/13 Python
Python实现栈的方法
2015/05/26 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
函授毕业生的自我鉴定
2013/11/26 职场文书
违纪检讨书范文
2015/01/27 职场文书
广播体操比赛主持词
2015/06/29 职场文书
学生会工作感言
2015/08/07 职场文书
公司董事任命书
2015/09/21 职场文书
2016年区委书记抓基层党建工作公开承诺书
2016/03/25 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL