跟老齐学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爬虫包 BeautifulSoup  递归抓取实例详解
Jan 28 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 Python
从django的中间件直接返回请求的方法
May 30 Python
Python TestCase中的断言方法介绍
May 02 Python
python实现邮件自动发送
Aug 10 Python
python求平均数、方差、中位数的例子
Aug 22 Python
pytorch中的inference使用实例
Feb 20 Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 Python
python3 logging日志封装实例
Apr 08 Python
python构造IP报文实例
May 05 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
如何在Win10系统使用Python3连接Hive
Oct 15 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
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
asp.net HttpHandler实现图片防盗链
2009/11/09 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
Python md5与sha1加密算法用法分析
2017/07/14 Python
python编程线性回归代码示例
2017/12/07 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
python基于SMTP协议发送邮件
2019/05/31 Python
django之对FileField字段的upload_to的设定方法
2019/07/28 Python
Flask框架钩子函数功能与用法分析
2019/08/02 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
Python&amp;&amp;GDAL实现NDVI的计算方式
2020/01/09 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
美国智能家居专家:tink
2019/06/04 全球购物
super()与this()的区别
2016/01/17 面试题
人力资源部培训专员岗位职责
2014/01/02 职场文书
上班上网检讨书
2014/01/29 职场文书
关键在于落实心得体会
2014/09/03 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
浅谈如何保证Mysql主从一致
2022/03/13 MySQL