浅谈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函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
随机推荐
- JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别
一.包装类 Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足, 在设计类时为每个基本数据类型设计了一个对应的类进行代表,这 ...
- 让两个数x,y一直保持互质的模版
int gcd(int x,int y) { )return x; else return gcd(y,x%y); }
- Vijos P1497 立体图【模拟】
立体图 描述 小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容.最近,他准备给小朋友讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子, ...
- BZOJ1226: [SDOI2009]学校食堂Dining
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1226 状压dp. f[i][s][k]表示原顺序中前i-1个人都吃了饭,当前状态为s(i及i之 ...
- 2017ecjtu-summer training #1 UVA 10399
It has been said that a watch that is stopped keeps better time than one that loses 1 second per day ...
- dedecms====phpcms 区别==[工作]
{template "content","header"}{dede:include filename="head.htm"/} ----- ...
- ios7对于NSString对象进行了的变更
1.instancetype替代id来做返回值的类型.
- Java面试经
最近趁有空整理下面试经常会被问到的知识点,参考的资料都是本人通过百度而挑选出来的,具有一定的参考意义. 一 .java基础1.String和StringBuffer.StringBuild的区别:ht ...
- MySql优化子查询
用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM ...
- Oracle创建、管理撤销表空间
撤销管理模式: 用户通过设定撤销管理模式(undo mode)就可以灵活地选择使用手动撤销管理(manual undo management)或自动撤销管理(automatic undo manage ...