前面我们定义了人的类,并用这个类实例化出两个人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)

我们可以看到teacherstudent类中,有很多重复的代码。

它们都有人类所共有的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")

就可以调用s1t1的特征和技能了。

比如,我想知道学生的姓名和老师的年龄,就可以这样做:

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的对象的三大特性之继承的更多相关文章

  1. 浅谈python的对象的三大特性之封装

    我们家里都有电视机,从开机,浏览节目,换台到关机,我们不需要知道电视机里面的具体细节,只需要在用的时候按下遥控器就可以完成操作,这就是功能的封装. 在用支付宝进行付款的时候,只需要在用的时候把二唯码给 ...

  2. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  3. python基础(24):面向对象三大特性一(继承)

    1. 继承 1.1 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继 ...

  4. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

  5. python - class类 (四) 三大特性之一 :继承

    继承: #继承 #什么时候用继承? # 1.当类之间有显著的不同,并且较小的类是较大的类的所需的组建时,用组合比较好. # 2.当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 # ...

  6. python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试

    一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...

  7. C#核心基础--浅谈类和对象的概念

    浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...

  8. 浅谈python字符串存储形式

    http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...

  9. 开发技术--浅谈Python函数

    开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...

随机推荐

  1. 使用 webpack + react + redux + es6 开发组件化前端项目

    因为最近在工作中尝试了 webpack.react.redux.es6 技术栈,所以总结出了一套 boilerplate,以便下次做项目时可以快速开始,并进行持续优化.对应的项目地址:webpack- ...

  2. BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 10374  Solved: 4535[Subm ...

  3. string::npos的一些说明

    一.定义 std:: string ::npos的定义: static const size_t npos = -1; 表示 size_t 的最大值( Maximum value for size_t ...

  4. 如何在VS2017中使用快捷键格式化代码?

    1.同时按住Ctrl键+A键,全选代码或要格式化的部分代码: 2.再按住Ctrl键,接着按一下K键,接着按一下F键.(注意:Ctrl键在按后面这2个键的时候一直是按着的,直到F键按完才松开).也就是俗 ...

  5. Video Target Tracking Based on Online Learning—TLD多目标跟踪算法

    TLD算法回顾 TLD(Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生Zdenek Kalal在其攻读博士学位期间提出的一种新的单目标长时间(long ter ...

  6. CSS鼠标样式 cursor 属性

    值 描述 url 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标. default 默认光标(通常是一个箭头) auto 默认.浏览器 ...

  7. 把自己的js模块兼容到AMD CMD CommonJS

    为了让同一个模块可以运行在前后端,在写作过程中需要考虑兼容前端也实现了模块规范的环境.为了保持前后端的一致性,类库开发者需要将类库代码包装在一个闭包内.以下代码演示如何将hello()方法定义到不同的 ...

  8. 微信公众平台宣布增加接口IP白名单提高安全性

    微信公众平台目前已经发布通知在平台接口调用上为了提高安全性需要添加IP白名单并仅允许白名单IP调用. 目前微信公众平台面向开发者主要提供的开发者ID和开发者密钥,在调用时ID和密钥通过检验即可进行调用 ...

  9. arclistsg文档独立模型标签

    [标签名称] arclistsg [标签简介] 单表独立模型的文档列表调用标记 [功能说明] 用于调用单表模型的内容,在V5.3系统以上版本中加入了单表模型的概念,脱离了以前的主从表的数据表关联结构, ...

  10. PHP和Python如何选择?或许可以考虑这三个问题

    撤稿纠错 文/黄小天.李亚洲 (选自Hackernoon 机器之心编译) 2017 年可谓是网页应用与 API 之年,开发者不用每次重新发明轮子,而是利用脚手架和第三方库就能确保项目在几天内实时部署. ...