跟老齐学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实现的下载网页源码功能示例
Jun 13 Python
Python简单实现控制电脑的方法
Jan 22 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 Python
python实现ID3决策树算法
Aug 29 Python
python实现趣味图片字符化
Apr 30 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
MxNet预训练模型到Pytorch模型的转换方式
May 25 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 Python
python小程序之飘落的银杏
Apr 17 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 trim 去除空字符的定义与语法介绍
2010/05/31 PHP
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
Yii2如何批量添加数据
2016/05/17 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
JavaScript 中的事件教程
2007/04/05 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
2015/03/03 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
前台接待员岗位职责
2014/01/02 职场文书
课程改革实施方案
2014/03/16 职场文书
《搭石》教学反思
2014/04/07 职场文书
党员群众路线承诺书
2014/05/20 职场文书
农村党支部书记司法四风问题对照检查材料
2014/09/26 职场文书
车辆年检委托书范本
2014/10/14 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
走进毛泽东观后感
2015/06/04 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
JavaScript实现登录窗体
2021/06/22 Javascript
Java中使用Filter过滤器的方法
2021/06/28 Java/Android