跟老齐学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 元组(Tuple)操作详解
Mar 11 Python
浅析Python中signal包的使用
Nov 13 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
对numpy下的轴交换transpose和swapaxes的示例解读
Jun 26 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
Python如何使用OS模块调用cmd
Feb 27 Python
Python类和实例的属性机制原理详解
Mar 21 Python
Django如何使用jwt获取用户信息
Apr 21 Python
Python接口开发实现步骤详解
Apr 26 Python
Pandas对每个分组应用apply函数的实现
Dec 13 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
Terran建筑一览
2020/03/14 星际争霸
PHP获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
2013/09/28 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
php实现简单爬虫的开发
2016/03/28 PHP
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
Javascript实现图片不间断滚动的代码
2016/06/22 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
Bootstrap导航菜单点击后无法自动添加active的处理方法
2018/08/10 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
理解Python中的类与实例
2015/04/27 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
十岁生日父母答谢词
2014/01/18 职场文书
火车的故事教学反思
2014/02/11 职场文书
开工仪式主持词
2014/03/20 职场文书
生日宴会策划方案
2014/06/03 职场文书
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python