一、面向对象程序设计方法的由来
1、面向过程的程序设计方法
1.1基本步骤
1.2 面向过程的程序设计特点
过程化程序设计的典型方法是“结构化程序设计”方法,是由荷兰学者Dijkstra在70年代提出的。 程序设计原则:自上而下、逐步求精、模块化编程等。
程序结构如下:
程序组成:由传递参数的函数集合组成,每个函数处理它的参数,并可能返回某个值。即:主模块+子模块,它们之间以数据作为连接(程序=算法+数据结构)。
程序特点:程序是以过程为中心的。程序员必须基于过程来组织模块。数据处于次要的地位,而过程是关心的重点。
优点:有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。
1.3 面向过程的程序设计的缺点
一旦问题(数据)改变,程序员则需要改写或重新编写新的解决方法(功能函数),有时几个关键的数据结构发生变化,将导致整个软件系统的结构崩溃。随着软件规模和复杂性的增长,这种缺陷日益明显。当程序达到一定规模后,为了修改一个小的错误,常可能引出多个大的错误,究其原因,问题就出在传统的程序设计方式上。一般适用于中小型的程序设计及编程应用。
当前的软件应用领域已从传统的科学计算和事务处理扩展到了其它的很多方面,如人工智能、计算机辅助设计和辅助制造等,所需处理的数据也已从简单的数字和字符串发展为记录在各种介质上并且有多种格式的多媒体数据,如数字、正文、图形、声音和影像等。数据量和数据类型的空前激增导致了许多程序的规模和复杂性均接近或达到了用结构化程序设计方法无法管理的程度。
只能以函数的方式实现代码重用,效率低,是手工作坊式的编程模式。作为软件公司,都希望设计的程序具有可重用性,即能否建立一些具有已知特性的部件,应用程序通过部件组装即可得到一个新的系统;
#求解铅球的飞行距离
from math import pi,sin,cos,radians
#根据提示输入仿真参数
def getInputs():
angle=eval(input("Enter the launch angle(in degree):"))
vel=eval(input('Enter the initial velocity(in meters/sec):'))
h0=eval(input('Enter the initial height(in meter):'))
time=eval(input('Enter the time interval:'))
return anglle,vel,h0,time
def getXYComponents(vel,angle):
theta=radians(angle)
xvel=vel*cos(theta)
yvel=vel*sin(theta)
return xvel,yvel
def updatePosition(time,xpos,ypos,xvel,yvel):
xpos=xpos+time*xvel
yvell=yvel-time*9.8
ypos=ypos+time*(yvell+yvel)/2
yvel=yvell
return xpos,ypos,yvel
def main():
angle,vel,h0,time=getInputs()
xpos,ypos=0,h0
xvel,yvel=getXYConponents(vel,angle)
while ypos>=0:
xpos,ypos,yvel=updatePosition(time,xpos,ypos,xvel,yvel)
print('\Dnistance traveled:(0:0.1f) meter.'.format(xpos))
2、面向对象程序设计方法
面向对象编程是一种组织程序的新型思维方式,软件设计的焦点不再是程序的逻辑流程,而是软件或程序中的对象以及对象之间的关系。
面向对象程序设计方法优点:
程序模块间的关系更加简单,程序模块的独立性、数据的安全性就更有了良好的保障;
通过继承和多态性,可以大大t提高程序的可重用性、使得软件的开发和维护都更为方便。
3.、python 支持的编程方式
python支持面向过程、面向对象、函数式编程等多种编程方式;
Python不强制使用任何一种编程方式,可以使用面向过程方式编写任何程序,在编写小程序(少于500行代码)时,不会有问题。但对于中等和大型项目来说,面向对象会带来很多优势。
Python对面向对象的语法进行了简化,去掉了面向对象中许多复杂的特性。例如,类的属性和方法的限制符—public、private、protected。
Python提倡语法的简单、易用性,这些访问权限靠程序员自觉遵守,而不强制使用。
二、类和对象
2.1类的定义
Python使用class关键字定义一个类,类名首字符一般要大写。
当需要创建的类型不能用简单类型(内置类型)来表示时,则需要定义类,然后利用定义的类创建对象。
格式: class Class_name(object):
# 创建一个person 类
class Person(object):
def __init__(self):#类的构造函数,用来初始化对象
self.name=''
self.age=0
def display(self): #类中定义的函数也称方法
print('Person(%s,%d)'%(self.name,self.age))
obj1=Person()
obj1.name='lihaniey '
obj1.age=18
obj1.display()
输出结果:
Person(lihaniey ,18)
当定义一个类时,如果这个类没有任何父类,则将object设置为它的父类,用这种方式定义的类属于新式类。如果定义的类没有设置任何父类,则这种方式定义的类属于经典类。建议使用新式类,新式类将类与内置类型进行了统一。
新式类与经典类在多重继承问题中有一个重要的区别:对于经典类,继承顺序是采用深度优先的搜索算法,对于新式类,继承顺序是采用广度优先的搜索算法。
self是指向对象本身的变量,类似于C++的this指针。Python要求,类内定义的每个方法的第一个参数是self,通过实例调用时,该方法才会绑定到该实例上。
在例子中,定义了一个方法display,用于显示对象的值。 Python还提供了一些特殊方法,能够定制对象的输出。如: 特殊方法__str__,用于生成对象的字符串表示(适合于人阅读的形式); 特殊方法__repr__,返回对象的“官方”表示(适合于解释器读取的形式);此外,可以通过eval()函数重新生成对象。 在大多数类中,方法__repr__都与__str__相同。