前面我们定义了人的类,并用这个类实例化出两个人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. 【JavaScript随机生成验证码及其颜色】

    css样式: <style type="text/css"> /*给验证码设一个盒子*/ #yzm{ width: 120px; height: 50px; text- ...

  2. BZOJ3997: [TJOI2015]组合数学(网络流)

    3997: [TJOI2015]组合数学 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 405  Solved: 284[Submit][Status ...

  3. c++(循环单向链表)

    前面的博客中,我们曾经有一篇专门讲到单向链表的内容.那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面.有了循环,意味着我们可以从任何一个链表节点开始工作,可 ...

  4. logback的使用和logback.xml详解

    一.logback的介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: logback-core:其它两 ...

  5. sublime 中HTML快捷键

  6. fsockopen — 打开一个网络连接或者一个Unix套接字连接

    fsockopen (PHP 4, PHP 5, PHP 7) 说明 resource fsockopen ( string $hostname [, int $port = -1 [, int &a ...

  7. 认识Java(1)

    Java是一门程序设计语言. 有三个方向: JAVA SE (java platform standard edition):包含java核心类,如数据库.接口.网络编程. JAVA ME(java ...

  8. JavaScript对象的valueOf()方法

    js对象中的valueOf()方法和toString()方法非常类似,但是,当需要返回对象的原始值而非字符串的时候才调用它,尤其是转换为数字的时候.如果在需要使用原始值的上下文中使用了对象,JavaS ...

  9. subList ArrayList LinkedList

    List<E> subList(int fromIndex,int toIndex) 该方法返回原有集合从fromIndex 到 toIndex之间一部分数据,组成一个新的集合,这两个集合 ...

  10. JVM-类的四种载入方式

    package org.burning.sport.javase.classloader; public class ClassLoaderMain { public static void main ...