跟老齐学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正则表达式介绍
Aug 06 Python
讲解Python中fileno()方法的使用
May 24 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
Python中的单继承与多继承实例分析
May 10 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
用python写扫雷游戏实例代码分享
May 27 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
python 实现list或string按指定分段
Dec 25 Python
NumPy排序的实现
Jan 21 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
Python基础类继承重写实现原理解析
Apr 03 Python
聊聊python中的异常嵌套
Sep 01 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
建立文件交换功能的脚本(一)
2006/10/09 PHP
javascript 小型动画组件与实现代码
2010/06/02 PHP
phpMyAdmin无法登陆的解决方法
2017/04/27 PHP
jquery之empty()与remove()区别说明
2010/09/10 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
python之生产者消费者模型实现详解
2019/07/27 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
自动化职业生涯规划书范文
2014/01/03 职场文书
采购部部长岗位职责
2014/02/06 职场文书
生物工程专业求职信
2014/09/03 职场文书
公司离职证明范本
2014/10/17 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
初中中等生评语
2014/12/29 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
python ansible自动化运维工具执行流程
2021/06/24 Python
Redis+AOP+自定义注解实现限流
2022/06/28 Redis