python是一种面向对象的语言。面向对象程序设计中的术语对象基本上可以看做数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。使用对象替代全局变量和函数的原因可能有很多,其中对象最重要的优点包括三个方面:
- 多态:可以对不同类的对象使用同样的操作
- 封装:对外部世界隐藏对象的工作细节
- 继承:以普通的类为基础建立专门的类对象
多态和方法
程序得到了一个对象,不知道它是怎么实现的,它可能有多种"形状"。
绑定到对象特性上面的函数称为方法。
>>> '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'
继承
如果已经有了一个类,又想建立一个新的类似的类,让新的类从老的类中继承方法,新的类增加几个方法