上次写的面向对象的基础知识, 这一节继续面向对象(OOP)继承篇。

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继
承完全可以理解成类之间的 类型和子类型 关系。
假设你想要写一个程序来记录学校之中的教师和学生情况。他们有一些共同属性,比如姓名、年龄和
地址。他们也有专有的属性,比如教师的薪水、课程和假期,学生的成绩和学费。
你可以为教师和学生建立两个独立的类来处理它们,但是这样做的话,如果要增加一个新的共有属性,就
意味着要在这两个独立的类中都增加这个属性。这很快就会显得不实用。

一个比较好的方法是创建一个共同的类称为 SchoolMember 然后让教师和学生的类 继承 这个共同的
类。即它们都是这个类型(类)的子类型,然后我们再为这些子类型添加专有的属性。
使用这种方法有很多优点。如果我们增加/改变了 SchoolMember 中的任何功能,它会自动地反映到子
类型之中。例如,你要为教师和学生都增加一个新的身份证域,那么你只需简单地把它加到 SchoolMember
类中。然而,在一个子类型之中做的改动不会影响到别的子类型。另外一个优点是你可以把教师和学生对
象都作为 SchoolMember 对象来使用,这在某些场合特别有用,比如统计学校成员的人数。一个子类型在任
何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象。
另外,我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而如果我们使用独立
的类的话,我们就不得不这么做了。
在上述的场合中,SchoolMember 类被称为 基本类 或 超类 。 Teacher 和 Student 类被称为 导出类 或而
子类 。
现在,我们将学习一个例子程序。

[python] view plaincopyprint?
  1. #!/usr/bin/python
  2. # Filename: inherit.py
  3. class SchoolMember:
  4. '''''Represents any school member.'''
  5. def __init__(self, name, age):
  6. self.name = name
  7. self.age = age
  8. print'(Initialized SchoolMember: %s)' % self.name
  9. def tell(self):
  10. '''''Tell my details.'''
  11. print'Name:"%s" Age:"%s"' % (self.name, self.age),
  12. class Teacher(SchoolMember):
  13. '''''Represents a teacher.'''
  14. def __init__(self, name, age, salary):
  15. SchoolMember.__init__(self, name, age)
  16. self.salary = salary
  17. print'(Initialized Teacher: %s)' % self.name
  18. def tell(self):
  19. SchoolMember.tell(self)
  20. print'Salary: "%d"' % self.salary
  21. class Student(SchoolMember):
  22. '''''Represents a student.'''
  23. def __init__(self, name, age, marks):
  24. SchoolMember.__init__(self, name, age)
  25. self.marks = marks
  26. print'(Initialized Student: %s)' % self.name
  27. def tell(self):
  28. SchoolMember.tell(self)
  29. print'Marks: "%d"' % self.marks
  30. t = Teacher('Mrs. Shrividya', 40, 30000)
  31. s = Student('Horst', 22, 75)
  32. print# prints a blank line
  33. members = [t, s]
  34. for member in members:
  35. member.tell() # works for both Teachers and Students
#!/usr/bin/python
# Filename: inherit.py
class SchoolMember:'''Represents any school member.'''def __init__(self, name, age):self.name = nameself.age = ageprint '(Initialized SchoolMember: %s)' % self.namedef tell(self):'''Tell my details.'''print 'Name:"%s" Age:"%s"' % (self.name, self.age),
class Teacher(SchoolMember):'''Represents a teacher.'''def __init__(self, name, age, salary):SchoolMember.__init__(self, name, age)self.salary = salaryprint '(Initialized Teacher: %s)' % self.namedef tell(self):SchoolMember.tell(self)print 'Salary: "%d"' % self.salary
class Student(SchoolMember):'''Represents a student.'''def __init__(self, name, age, marks):SchoolMember.__init__(self, name, age)self.marks = marksprint '(Initialized Student: %s)' % self.namedef tell(self):SchoolMember.tell(self)print 'Marks: "%d"' % self.marks
t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Horst', 22, 75)
print # prints a blank line
members = [t, s]
for member in members:member.tell() # works for both Teachers and Students

输出

[html] view plaincopyprint?
  1. (Initialized SchoolMember: Mrs. Shrividya)
  2. (Initialized Teacher: Mrs. Shrividya)
  3. (Initialized SchoolMember: Horst)
  4. (Initialized Student: Horst)
  5. Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
  6. Name:"Horst" Age:"22" Marks: "75"
(Initialized SchoolMember: Mrs. Shrividya)
(Initialized Teacher: Mrs. Shrividya)
(Initialized SchoolMember: Horst)
(Initialized Student: Horst)Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
Name:"Horst" Age:"22" Marks: "75"

为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然后,我们注意到基
本类的__init__方法专门使用 self 变量调用,这样我们就可以初始化对象的基本类部分。这一点十分重要—
—Python 不会自动调用基本类的 constructor,你得亲自专门调用它。
我们还观察到我们在方法调用之前加上类名称前缀,然后把 self 变量及其他参数传递给它。
注意,在我们使用 SchoolMember 类的 tell 方法的时候,我们把 Teacher 和 Student 的实例仅仅作为
SchoolMember 的实例。
另外,在这个例子中,我们调用了子类型的 tell 方法,而不是 SchoolMember 类的 tell 方法。可以这样
来理解,Python 总是首先查找对应类型的方法,在这个例子中就是如此。如果它不能在导出类中找到对应
的方法,它才开始到基本类中逐个查找。基本类是在类定义的时候,在元组之中指明的。

一个术语的注释——如果在继承元组中列了一个以上的类,那么它就被称作 多重继承 。

好的, 整个面向对象就到这里,我们已经研究了类和对象的多个内容以及与它们相关的多个术语。通过本章,你已经了解了面向对象
的编程的优点和缺陷。Python 是一个高度面向对象的语言,理解这些概念会在将来有助于你进一步深入学习 Python。

转载于:https://www.cnblogs.com/szgzwc/archive/2012/11/07/2758349.html

python学习之路-继承相关推荐

  1. Python学习之路—2018/7/14

    Python学习之路-2018/7/12 3.功能开发 3.3 设计博客首页 博客首页中最重要的就是中间的文章区域,所以我首先把文章区域设计出来,一开始并没有数据,如果用orm添加或者直接在数据库添加 ...

  2. Python学习之路9☞面向对象的程序设计

    Python学习之路9☞面向对象的程序设计 一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什 ...

  3. 我的Python学习之路(一)_Mr_Ouyang

    我的Python学习之路(一)_Mr_Ouyang 笔者按: 本文从18:55开始写作,至19:38中断,又从21:12始继续,至23:22写就. 共计耗时113分钟,总字数9081字,约80.4字/ ...

  4. Python学习之路【第一篇】-Python简介和基础入门

    1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...

  5. python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...

    教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...

  6. Python学习之路—2018/6/20

    Python学习之路-2018/6/20 1.模板语法之变量 views.py def index(request):import datetimes="gyq"l=[1,2,3] ...

  7. C/C++学习之路: 继承

    C/C++学习之路: 继承 目录 继承概述 派生类访问控制 继承中的构造和析构 继承中同名函数的处理方法 非自动继承的函数 继承中静态成员特性 多继承 1. 继承概述 1. 继承基本概念 c++最重要 ...

  8. python 学习之路开始了

    python 学习之路开始了.....记录点点滴滴.... 转载于:https://www.cnblogs.com/chobit/p/6163287.html

  9. Python学习之路5☞文件处理

    Python学习之路5☞文件处理 一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 1 正趣果上果 2 Interesting fruit fruit 3 4 ...

最新文章

  1. ubuntu下安装mysql
  2. WPF Demo18 路由事件
  3. 各种数据库连接的总结
  4. 川职院单招计算机考什么专业,四川单招考什么科目
  5. 【codevs1993】草地排水,网络流入门(dinic+ispa)
  6. 11.1金山游戏开发笔试
  7. 用Docker快速搭建一个博客网站,很简单的嘛~
  8. 2018蓝桥杯A组:分数(3种方法 循环累称 快速幂运算 移位运算)
  9. 怎样快速更新已安装的软件?
  10. 挑战:工资计算器读写数据文件
  11. 带你轻轻松松了解route-map
  12. 手工笔筒制作教程(附彩色贴图分享)
  13. 社科研究方法汇总(含SPSS教程、Maxdea、实验法、社会网络分析法、统计调查法、访谈法)
  14. 网络爬虫基础-scrapy框架
  15. 计算机网络怎么查看连接打印机驱动,怎么检查电脑中是否已成功连接网络打印机...
  16. 苹果手表Apple Watch 无法检查更新 iOS14.5 14.6 14.7
  17. 罗振宇解读《今日简史》:21个议题就是21个千亿美金的机会
  18. 英语每日阅读---8、VOA慢速英语(翻译+字幕+讲解):脸肓症患者记不住别人的脸
  19. 使用Goodcrawler爬取700集的柯南
  20. 如何在线批量进行PDF拆分

热门文章

  1. 微信分享时,描述内容怎么换行
  2. spring mvc 接收List数组类型参数
  3. 返回值类型与函数类型不匹配_golang基础语法,定义函数类型 为已存在的数据类型起别名...
  4. JavaScript id_好程序员web前端分享Javascript中函数作为对象
  5. python无参数装饰器_python_之无参装饰器_01
  6. 商品规格js_品优购电商系统开发 第3章 规格及模板管理
  7. 小甲鱼python课后题答案_Python 小甲鱼教程 课后练习44
  8. java axis2小实例_java webservice axis2简单开发实例
  9. system.img解包打包工具_好程序员云计算学习路线分享文件打包及压缩
  10. IBM p5服务器上的虚拟 分享,IBMp5服务器系统虚拟技术详解