跟老齐学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实现实例
Apr 26 Python
python实现合并两个数组的方法
May 16 Python
Python 字典与字符串的互转实例
Jan 13 Python
python僵尸进程产生的原因
Jul 21 Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
python提取具有某种特定字符串的行数据方法
Dec 11 Python
Django Celery异步任务队列的实现
Jul 24 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 Python
Python numpy多维数组实现原理详解
Mar 10 Python
学会python自动收发邮件 代替你问候女友
May 20 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
javaScript基础详解
2017/01/19 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
Python内置函数dir详解
2015/04/14 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
python读取LMDB中图像的方法
2018/07/02 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
python主要用于哪些方向
2020/07/05 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
美国第一香水网站:Perfume.com
2017/01/23 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技