python中对象的多态、封装、继承介绍

python是一种面向对象的语言。面向对象程序设计中的术语对象基本上可以看做数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。使用对象替代全局变量和函数的原因可能有很多,其中对象最重要的优点包括三个方面:

  1. 多态:可以对不同类的对象使用同样的操作
  2. 封装:对外部世界隐藏对象的工作细节
  3. 继承:以普通的类为基础建立专门的类对象

多态和方法

程序得到了一个对象,不知道它是怎么实现的,它可能有多种"形状"。

绑定到对象特性上面的函数称为方法。

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

 对应变量x来说,不需要知道它是字符串还是列表,就可以调用它的count方法,不用管它是什么类型

举例,标准库random中包含choice函数,可以从序列中随机选出元素。给变量赋值:

>>> from random import choice
>>> x=choice(['Hello,world!',[1,2,'e','e',4]])

运行后,变量x随机选择一个值

>>> x.count('e')
1
>>> x
'Hello,world!'
>>> 

多态的多种形式

任何不知道对象到底是什么类型,但是又要对对象操作时,都会用到多态。

>>> 1+2
3
>>> 'Hello,'+'world'
'Hello,world'
>>> add(1,2)
3
>>> add('Hello,','world')
'Hello,world'

参数可以是任何支持加法的对象。

编写打印对象长度消息的函数

>>> def length_message(x):
    print "The length of",repr(x),"is",len(x)

函数中使用了repr函数,repr函数是多态特性的代表之一

>>> length_message('Fnord')
The length of 'Fnord' is 5
>>> length_message([1,2,3])
The length of [1, 2, 3] is 3

封装

封装是对全局作用域中其他区域隐藏多余信息的原则。不用关心对象是如何构建的而直接进行使用

假设有一个叫做OpenObject的类:

>>> o=OpenObject()
>>> o.setName('Sir Lancelot')
>>> o.getName() #此案例并不能运行成功,只是假设
'Sir Lancelot'

创建了一个对象后,将变量o绑定到该对象上。可以使用setName和getName方法(假设已经由OpenObject类提供)。

假如变量o将它的名字存储在全局变量globalName中:

在使用OpenObject类的实例时,不得不关心globalName的内容。

>>> globalName
'Sir Lancelot'
>>> globalName='Sir Gumby'
>>> o.getName() 
'Sir Gumby'

如果创建了多个OpenObject实例会出现问题

>>> o1=OpenObject()
>>> o2=OpenObject()
>>> o1.setName('Robin Hood')
>>> o2.getName()
'Robin Hood'

如果不用全局变量而用特性重写类,并且重命名为ClosedObject

>>> c=ClosedObject()
>>> c.setName('Sir Lancelot')
>>> c.getName()
'Sir Lancelot'

>>> r=ClosedObject()
>>> r.setName('Sir Robin')
>>> r.getName()
'Sir Robin

>>> c.getName()
'Sir Lancelot'

继承

 如果已经有了一个类,又想建立一个新的类似的类,让新的类从老的类中继承方法,新的类增加几个方法

原文地址:https://www.cnblogs.com/nsds/p/6489790.html