跟老齐学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字符串连接的N种方式总结
Sep 17 Python
介绍Python的Urllib库的一些高级用法
Apr 30 Python
Python语言实现机器学习的K-近邻算法
Jun 11 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
Python实现的各种常见分布算法示例
Dec 13 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
python动态进度条的实现代码
Jul 03 Python
python中eval与int的区别浅析
Aug 11 Python
python 追踪except信息方式
Apr 25 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正则校验用户名介绍
2008/07/19 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
微信自定义分享php代码分析
2016/11/24 PHP
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
Web纯前端“旭日图”实现元素周期表
2017/03/10 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
js实现多个倒计时并行 js拼团倒计时
2019/02/25 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
Python制作数据导入导出工具
2015/07/31 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Python全局变量用法实例分析
2016/07/19 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
用Python实现数据的透视表的方法
2018/11/16 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
基于django2.2连oracle11g解决版本冲突的问题
2020/07/02 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
Antler英国官网:购买安特丽行李箱、拉杆箱
2019/08/25 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
大学军训感言400字
2014/03/11 职场文书
追悼会主持词
2014/03/20 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
政治思想表现评语
2014/05/04 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python