Python面向对象编程(二)

  在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。

  在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Python支持多继承,能够让一个子类有多个父类。

一.继承和多继承

  在Python中类的继承定义基本形式如下:

#父类class superClassName:    block#子类class subClassName(superClassName):    block

  在定义一个类的时候,可以在类名后面紧跟一对括号,在括号中指定所继承的父类,如果有多个父类,多个父类名之间用逗号隔开。以大学里的学生和老师举例,可以定义一个父类UniversityMember,然后类Student和类Teacher分别继承类UniversityMember:

class UniversityMember:    def __init__(self,name,age):        self.name = name        self.age = age    def getName(self):        return self.name    def getAge(self):        return self.ageclass Student(UniversityMember):    def __init__(self,name,age,sno,mark):        UniversityMember.__init__(self,name,age)     #注意要显示调用父类构造方法,并传递参数self        self.sno = sno        self.mark = mark    def getSno(self):        return self.sno    def getMark(self):        return self.markclass Teacher(UniversityMember):    def __init__(self,name,age,tno,salary):        UniversityMember.__init__(self,name,age)        self.tno = tno        self.salary = salary    def getTno(self):        return self.tno    def getSalary(self):        return self.salary

  在大学中的每个成员都有姓名和年龄,而学生有学号和分数这2个属性,老师有教工号和工资这2个属性,从上面的代码中可以看到:

  1)在Python中,如果父类和子类都重新定义了构造方法__init( )__,在进行子类实例化的时候,子类的构造方法不会自动调用父类的构造方法,必须在子类中显示调用。

  2)如果需要在子类中调用父类的方法,需要以   父类名.方法  这种方式调用,以这种方式调用的时候,注意要传递self参数过去。

  对于继承关系,子类继承了父类所有的公有属性和方法,可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。

  对于多重继承,比如

  class SubClass(SuperClass1,SuperClass2)

  此时有一个问题就是如果SubClass没有重新定义构造方法,它会自动调用哪个父类的构造方法?这里记住一点:以第一个父类为中心。如果SubClass重新定义了构造方法,需要显示去调用父类的构造方法,此时调用哪个父类的构造方法由你自己决定;若SubClass没有重新定义构造方法,则只会执行第一个父类的构造方法。并且若SuperClass1和SuperClass2中有同名的方法,通过子类的实例化对象去调用该方法时调用的是第一个父类中的方法。

二.多态

  多态即多种形态,在运行时确定其状态,在编译阶段无法确定其类型,这就是多态。Python中的多态和Java以及C++中的多态有点不同,Python中的变量是弱类型的,在定义时不用指明其类型,它会根据需要在运行时确定变量的类型(个人觉得这也是多态的一种体现),并且Python本身是一种解释性语言,不进行预编译,因此它就只在运行时确定其状态,故也有人说Python是一种多态语言。在Python中很多地方都可以体现多态的特性,比如 内置函数len(object),len函数不仅可以计算字符串的长度,还可以计算列表、元组等对象中的数据个数,这里在运行时通过参数类型确定其具体的计算过程,正是多态的一种体现。有些朋友提出Python不支持多态,我是完全不赞同的,比如这篇博客《Python中的多态》中提到的:

  

  这种看法过于片面,Java以及C++是编译性语言,它们体现多态这种特性的方式和Python不同,所以不能只凭Java和C++中那种思维来理解Python中的多态,Python以它这种独有的方式体现多态的根本原因我觉得有两点:1)Python是解释性语言;2)Python中变量是弱类型的。所以Python体现多态的方式和Java决然不同,但是不能因为同Java中体现多态的方式不同就认为Python不支持多态,这种想法过于片面。

  关于Python面向对象编程暂时就讲解这么多了,至于如何设计类让它更符合软件工程的范畴和原则,这个暂时不在讨论范围之内,有兴趣的朋友可以看一下《大话设计模式》以及《Head First设计模式》这些书籍。

作者:Matrix海子

出处:http://www.cnblogs.com/dolphin0520/

(0)

相关推荐

  • 一日一技:在 Python 中编写抽象类

    摄影:产品经理 游玩:产品经理&kingname 在极客时间某设计模式相关的课程中,某老师说 Python 不支持抽象类和接口. 但实际上,Python 支持抽象类. Python 自带的ab ...

  • Python学习—面向对象编程基础篇

    python面向对象编程已经学完了,有必要进行一下记录总结,加深一下理解,不然似懂非懂容易忘记:面向对象的知识点很多,其中面向对象的高级篇:元类,需要另外一篇博客来写,最后还要手撸一个简单版本的ORM ...

  • Python 面向对象编程(一)

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程.下面就来了解一下如何在Python中进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类 ...

  • 面向对象编程(二)

    使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student ...

  • Python 面向对象编程的核心概念知识点简介

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于 无量测试之道 ,作者: 无量测试之道 面向对象编程的核心概念:封装,抽象,多态.继 ...

  • Python面向对象编程

    https://m.toutiao.com/is/dmnvNk6/?=Python面向对象编程 面向对象编程 到目前为止,我们已经使用函数.模块来操作我们的数据.这叫做 面向过程 的方式进行编程.然而 ...

  • 一文看懂Python面向对象编程(Python学习与新手入门必看)-绝对原创

    尽管网上有许多关于Python面向对像的编程介绍,小编我看完后总觉得不是很满意,也不过瘾,所以决定自己亲自动手写篇文章,帮你理解Python面向对象的编程的基本概念和核心思想.本文内含很多实例代码,以 ...

  • Python教程:面向对象编程的一些知识点总结

    类与实例 类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象的具体信息. 类.属性和方法命名规范 类名通常由大写字母打头.这是标准惯例,可以帮助你识别类,特别是在实例 ...

  • 【Python进阶】实战Python面向对象基本编程

    欢迎来到专栏<Python进阶>.在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件.数据的处理,Python各种好用的库如NumPy.Scipy.Matplotl ...

  • Python面向对象有什么特性?三大点!

    我们都知道,Python是一门面向对象的编程语言,它具有三大特性,那么你知道Python面向对象三大特性是什么?接下来我们通过这篇文章来详细了解一下. 第一点:封装 隐藏对象的属性和实现细节,仅对外提 ...