Python的封装、继承和多态

数据封装、继承和多态是面向对象的三大特点。

数据封装:

  在某个类中,比如Student类(初始化有name和score两个属性),每个实例都拥有各自的name,score这些数据。我们可以通过函数来访问这些数据,比如打印一个学生的成绩。直接定义一个输出函数,输出name和对应的score即可。

  但是,既然student实例本身就有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把“数据”给封装起来了,这些封装数据的函数是和Student类本身是关联起来的,我们称之为类的方法。这样一来,我们从外部看Student类,就只需要知道,创建实例需要给出name和score,而如何打印,都是在Student类的内部定义的,这些数据和逻辑被“封装”起来了,调用很容易,但却不用知道内部实现的细节。有一点,Python和静态语言不同,Python允许对实例变量绑定任何数据,也就是说,对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称都可能不同。

继承:

  在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类,而被继承的class称为基类、父类或超类。

  继承最大的好处就是子类获得了父类的全部功能。当然,也可以对子类增加一些方法。当子类和父类存在相同的方法时,我们说,子类方法覆盖了父类的方法,在代码运行的时候,总是会调用子类的方法。由此引出多态。继承可以把父类的所有功能直接拿过来,这样就不必从零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。

多态:

  首先,当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样。因为继承可以一级一级地继承下来,就好比爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object。Python的"file-like object"就是一种鸭子类型。对于真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为"file-like object"。许多函数接收的参数就是"file-like object",你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。

posted @ 2018-08-25 21:29  张皓钧z  阅读(353)  评论(0编辑  收藏  举报