天天看点

Python3 面向对象:多态、封装、继承

面向对象的编程中,对象意味着一系列数据(属性)以及一套访问和操作这些数据的方法。使用对象而非全局变量和函数的原因有多个,下面列出使用对象的最重要的好处:

  1. 多态:可对不同类型的对象执行相同的操作,操作仍可正常运行;
  2. 封装:对外部隐藏有关对象工作原理的细节;
  3. 继承:可基于通用类创建出专用类。

1.多态

多态即多种形态,这意味着即使你不知道变量只想的是哪种对象,也能对其操作,且操作的行为将随着对象所属的类型(类)而差异。

多态和方法:

当你收到一个对象,但不知道它是如何实现的——它可能是众多“形态”中的任何一种。你只要知道它具有询问价格这一功能就够了。

>>>object.get_price()
2.5
           

像这样与对象属性相关联的函数称为方法。字符串、列表和字典的方法其实也就是一种多态。

>>>'abc'.count('a')
1
>>>[1, 2, 'a'].count('a')
1
           

多态形式多样:

每当无需知道对象是说明样的就能对其执行操作时,都是多态在起作用。这不仅仅适用于方法,内置运算符和函数也大量使用了多态。

>>>1 + 2
3
>>>'Fish' + 'license'
'Fishlicense'
           

 很多函数和运算符都是多态的,你编写的大多数函数也是如此。每当你使用多态的函数和运算符时,多态都将发挥作用。事实上,破坏多要的唯一方法是使用type、issubclass等函数显式地执行类型检查,但应尽可能避免以这种方式破坏多态。重要的是,对象按你希望的那样形事,而非它是否是正确的类型(类)。

2.封装

封装指的是向外隐藏不必要的细节。有点像多态(无需知道对象的内部细节就可使用它)。多态和继承这两个概念很像,因为他们都是抽象的原则。

但封装不同于多态,多态让你无需知道对象所属的类(对象的类型)就能调用其方法,而封装让你无需知道对象的构造就能使用它。

基本上,你希望对象是抽象:当调用方法时无需操心其他的事情,如避免干扰全局变量。如何将名称封装在对象中呢?将其作为一个属性即可。属性是归属于对象的变量,就像方法一样。是将上,方法差不多就是与函数相关联的属性。对象有自己的状态。对象的状态由其属性(如名称)描述。对象的方法可能修改这些属性,因此对象将一系列函数(方法)组合起来,并赋予他们一些变量(属性)的劝你西安,而属性可用于在两次函数调用之间存储值。

3.继承

继承是另一种偷懒的方式。程序员总是想避免多次输入同样的代码(如创建函数达到这个目标)。如果已经有了一个类,并要创建一个与之很像的类(可能只是新增几个方法),该如何办呢?

例如,你可能已经有了一个名为Shape的类,它知道如何将自己绘制到屏幕上。现在你想创建一个名为Rectangle的类,但它不仅知道如何将自己绘制到屏幕上,而且还知道如何计算其面积。你不想重新编写draw方法,因为Shape已经有一个这样的方法。那么如何办呢?让Rectangel继承Shape的方法,使得对Rectangel对象调用方法时,将自动调用Shape类的这个方法。