跟老齐学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 相关文章推荐
php使用递归与迭代实现快速排序示例
Jan 23 Python
Django集成百度富文本编辑器uEditor攻略
Jul 04 Python
解密Python中的描述符(descriptor)
Jun 03 Python
简单谈谈python中的语句和语法
Aug 10 Python
python 判断网络连通的实现方法
Apr 22 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
python redis 批量设置过期key过程解析
Nov 26 Python
超全Python图像处理讲解(多模块实现)
Apr 13 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
在keras里实现自定义上采样层
Jun 28 Python
python爬取天气数据的实例详解
Nov 20 Python
python实现简单聊天功能
Jul 07 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的call_user_func传reference引发的思考
2010/07/23 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
总结Python中逻辑运算符的使用
2015/05/13 Python
详解python之简单主机批量管理工具
2017/01/27 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
python 实现人和电脑猜拳的示例代码
2020/03/02 Python
Python装饰器结合递归原理解析
2020/07/02 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
施工工地安全标语
2014/06/07 职场文书
《法国号》教学反思
2016/02/22 职场文书
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技