浅谈python的对象的三大特性之继承
前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间。
现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性。
前面定义了一个人的类,可是我们还知道,人都有属于自己的职业,比如说老师类,医生类,警察类等。
我们可以为每个职业都定义一个类,按照前面的定义,我们可以使用下面的代码来实现。
定义一个老师类:
class Teacher:
def __init__(self,name,age,sex,course):
self.name=name
self.age=age
self.sex=sex
self.course=course
def walk(self):
print("%s is walking slow"%self.name)
def teach(self):
print("%s is teaching"%self.name)
定义一个学生类:
class Student:
def __init__(self,name,age,sex,group):
self.name=name
self.age=age
self.sex=sex
self.group=group
def walk(self):
print("%s is walking slow"%self.name)
def study(self):
print("%s is studying hard"%self.name)
我们可以看到teacher和student类中,有很多重复的代码。
它们都有人类所共有的name,age,sex等特征,以及有人类有的walk这个技能,
那么我们就可以把人类共有的name,age,sex特征和walk技能抽离出来,生成一个人的类,
然后用老师和学生的类来继承人的类的这些特征和技能,这样可以避免写重复的代码。
继承关系是子类继承父类,是类与类之间的关系
解决代码重用的问题,减少代码冗余,这就是我们说的类的三大特征之一的继承。
把两个或多个类中的共同点抽离出来,生成一个新的类,也就是被继承的类,我们称之为父类
把从父类中继承特征和技能的类称为子类或基类
具体实现代码如下:
我们先把老师和学生中所重复的代码抽离出来,生成一个人类:
class Person:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def walk(self):
print("%s is walking slow"%self.name)
然后定义一个老师类,来继承人的类的一个特征和技能:
class Teacher(Person):
def __init__(self, name, age, sex, course):
Person.__init__(self, name, age, sex)
self.course = course
def teach(self):
print("%s is teaching" % self.name)
最后,再定义一个学生类,来继承人的类的一些特征和技能:
class Student(Person):
def __init__(self, name, age, sex,group):
Person.__init__(self, name, age, sex)
self.group = group
def study(self):
print("%s is studying hard" % self.name)
类定义好了,在通过把类实例化生成一个学生和一个老师
t1=Teacher("Jack",18,"male","python")
s1=Student("Tom",28,"female","group1")
就可以调用s1或t1的特征和技能了。
比如,我想知道学生的姓名和老师的年龄,就可以这样做:
print(t1.age,s1.name)
输出结果为:
18 Tom
调用老师t1的走路的技能:
t1.walk()
输出为:
Jack is walking slow
调用老师t1的教书的技能:
t1.teach()
输出为:
Jack is teaching
调用学生s1的走路的技能:
s1.walk()
输出为:
Tom is walking slow
调用学生s1学习的技能:
s1.study()
输出为:
Tom is studying hard
我们还可以使用下面的语句来查看子类Student所继承的父类的名称:
print(Student.__bases__)
得到结果如下:
(<class '__main__.Person'>,)
同样的,打印子类Teacher的父类也会得到同样的结果,显示其父类为Person.
在上面的输出中,可以看到输出结果是一个元组。这样的话,一个子类就可以继承多个父类了。
查看子类的父类得到的结果是前面定义的Person类,那我们查看Person的类的话,会得到什么样的结果呢?
print(Person.__bases__)
输出为:
(<class 'object'>,)
其结果也是一个元组,但是这里出现了一个object,那么这个object又是什么东东?
事实上,在python3中,所有的类默认都继承object类。
在python中:
凡是继承了object类的子类,以及该子类的子类都被为新式类;
没有继承object类的子类称为经典类.
所以python3中,所有的类都是新式类。
而在python2中,没有继承object的类,以及它的子类,通常称为经典类。
来看几个例子:
这几个例子,都是在python2的解释器中运行的:
>>> class Foo:
... pass
...
>>> Foo.__bases__
()
>>> class Bar(object):
... pass
...
>>> Bar.__bases__
(<type 'object'>,)
可以看到,Foo这个类是一个经典类,而定义的第二个Bar类则是一个新式类
在定义老师和学生类的时候,在类的名字后面要加上被继承的类Person的名字,以告诉python解释器,这里调用了类的继承的特性。
浅谈python的对象的三大特性之继承的更多相关文章
- 浅谈python的对象的三大特性之封装
我们家里都有电视机,从开机,浏览节目,换台到关机,我们不需要知道电视机里面的具体细节,只需要在用的时候按下遥控器就可以完成操作,这就是功能的封装. 在用支付宝进行付款的时候,只需要在用的时候把二唯码给 ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- python基础(24):面向对象三大特性一(继承)
1. 继承 1.1 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继 ...
- python学习 day23 面向对象三大特性之继承
### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...
- python - class类 (四) 三大特性之一 :继承
继承: #继承 #什么时候用继承? # 1.当类之间有显著的不同,并且较小的类是较大的类的所需的组建时,用组合比较好. # 2.当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 # ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- C#核心基础--浅谈类和对象的概念
浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...
- 浅谈python字符串存储形式
http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...
- 开发技术--浅谈Python函数
开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
随机推荐
- 【JavaScript的引入方式】
javascript: 是基于对象和事件驱动的客户端脚本[组成] Bom:浏览对象模型(与浏览器交互的方法和接口) Dom:文档对象模型(处理网页内容的方法和接口) ecma:核心(描述了js的语 ...
- CSS position: absolute、relative定位问题详解
CSS2.0 HandBook上的解释: 设置此属性值为 absolute 会将对象拖离出正常的文档流绝对定位,而不考虑它周围内容的布局.假如其他具有不同 z-index 属性的对象已经占据了给定的 ...
- 前端Web开发MVC模式-入门示例
MVC概论起初来之桌面应用开发.其实java的structs框架最能体现MVC框架:model模型是理解成服务器端的模块程序:view为发送给客服端的内容:control为servlet程序控制跳转和 ...
- 队列的存储结构的实现(C/C++实现)
存档 #include "iostream.h" #include "stdlib.h" #define max 20 typedef char elemtyp ...
- [bzoj1705] [Usaco2007 Nov]Telephone Wire 架设电话线
正常DP.. f[i][j]表示前i个电线杆,把第i个电线杆高度改为j的最少总费用.设原来电线杆高度为h[] f[i][j]=min{ f[i-1][k]+C*|j-k|+(j-h[i])^2,(k& ...
- c语言基础学习07
============================================================================= 涉及到的知识点有: 1.指针.指针的概念.指 ...
- c++(排序二叉树)
前面我们讲过双向链表的数据结构.每一个循环节点有两个指针,一个指向前面一个节点,一个指向后继节点,这样所有的节点像一颗颗珍珠一样被一根线穿在了一起.然而今天我们讨论的数据结构却有一点不同,它有三个节点 ...
- 了解 Python 语言中的时间处理
python 语言对于时间的处理继承了 C语言的传统,时间值是以秒为单位的浮点数,记录的是从1970年1月1日零点到现在的秒数,这个秒数可以转换成我们日常可阅读形式的日期和时间:我们下面首先来看一下p ...
- JavaScript八张思维导图—数组用法
JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...
- [拾 得]pipe和xargs的恩怨情仇
Photo by Joshua Sortino on Unsplash 坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/ ...