17、编程范式

面向过程编程

特点

面向过程编程是一种以过程为中心的编程思想,程序由一系列相互调用的过程组成。面向过程编程的主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。

面向过程编程强调 “自顶向下” 和 “精益求精” 的设计方式。解决一个复杂的问题的方法是将问题划分为多个子问题,将子问题再继续分解直到问题足够简单到可以在一个小步骤范围内解决。

优点

面向过程编程特别适合解决线性(或者说按部就班)的算法问题。在这类算法问题中,解决问题的途径由多个步骤构成,使用函数描述每个步骤,因此使用函数对问题建模非常合适。

缺点

面向过程编程不足之处就是它不适合某些种类问题的解决,例如图形化编程,在图形化编程中,客观世界由具体的对象(窗口、标签、按钮等)组成,无法自然的将函数与图形对象一一对应,因此面向过程编程不适合用于图形化编程的领域。

例子

# 读取文本文件的内容
def read_file(path):
    lines = ''
    file = open(path)
    for line in file:
        lines += line
    file.close()
    return lines

# 将小写字母转换为大写字母
def transform(input):
    output = input.upper()
    return output

# 把转换后的内容保存到文件中
def save_file(path, content):
    file = open(path, "w")
    file.write(content)
    file.close()

# 整合子程序
def main():
    input = read_file("test.txt")
    output = transform(input)
    save_file("test.txt", output)

# 运行主程序
main()

面向对象编程

面向对象编程是一种以对象为中心的编程思想,程序由一系列相互作用的对象组成。面向对象编程中,程序包含各种独立而又互相调用的对象,而在面向过程编程中,将程序看作一系列函数的集合。

面向对象程序设计方法是尽可能模拟人类的思维方式,使得软件的开发方法与过程尽可能接近人类认识世界、解决现实问题的方法和过程,也即使得描述问题的问题空间与问题的解决方案空间在结构上尽可能一致,把客观世界中的实体抽象为问题域中的对象。

例如图形化编程,在图形化编程中,客观世界由具体的对象(窗口、标签、按钮等)组成,可以自然的将对象与图形对象一一对应,因此面向对象编程适合用于图形化编程的领域。

基本概念

  • 类,类是相似对象的集合,类包含和描述了“具有共同特性和共同行为”的一组对象。
  • 实例,实例则指的是类的实例,实例包含属性和方法。
  • 属性,属性是指对象的特性。例如,存在一个对象 person,对象 person 的属性包括姓名和年龄。
  • 方法,方法是指对象的行为。例如,存在一个对象 person,对象person 的包括一个方法 show,通过调用方法 show 可以输出对象 person 的相关信息。
# 定义类Person
class Person:
    # 在该方法中定义属性
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    # 定义自我介绍方法 
    def show(self):
        print('My name is %s, I am %d years old' % (self.name, self.age))        

# 创建实例
tom = Person('tom', 10)        
jerry = Person('jerry', 12)        

# 调用类tom、jerry的方法
tom.show()
jerry.show()

基本特性

封装

封装是将数据和代码捆绑到一起,对象的某些属性和方法可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。防止了程序相互依赖性而带来的变动影响,有效实现了两个目标:对数据和行为的包装和信息隐藏。

# 创建Span类
class Span:
    # 创建私有属性(有下划线的为私有的,外部无法访问)
    def __init__(self, start, end):
        self._start = start
        self._end = end

    # 外界通过 get_start 获取开始位置
    def get_start(self):
        return self._start

    # 外界通过 get_end 获取结束位置
    def get_end(self):
        return self._end

    # 外界通过 get_length 获取间距的长度
    def get_length(self):
        return self._end - self._start

# 创建span实例
span = Span(10, 100)

# 调用方法
print('start = %d' % span.get_start())
print('end = %d' % span.get_end())
print('length = %d' % span.get_length())

继承

继承是一种层次模型,这种层次模型能够被重用。层次结构的上层具有通用性,但是下层结构则具有特殊性。在继承的过程中,子类则可以从父类继承一些方法和属性。子类除了可以继承以外同时还能够进行修改或者添加。

# 创建Person类
class Person:
    # 定义属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 定义方法
    def introduce(self):
        print('My name is', self.name)
        print('My age is', self.age)


# 创建Teacher类,继承自Person类
class Teacher(Person):
    def __init__(self, name, age, salary):
        # 继承Person类的属性,并添加一个属性
        Person.__init__(self, name, age)
        self.salary = salary
    
    # 定义方法
    def showSalary(self):
        print('My salary is', self.salary)

# 创建实例
teacher = Teacher('tom', 30, 5000)

# 调用Person类的方法
teacher.introduce() 

# 调用Teacher类的方法
teacher.showSalary()

多态

在面向对象语言中,接口的多种不同的实现方式即为多态。多态机制使具有不同内部结构的对象可以共享相同的外部接口,它是面向对象程序设计(OOP)的一个重要特征。

# 创建Shape类(各种形状)
class Shape:
    # 定义计算周长的方法
    def get_circle(self):
        pass

# 创建Square类(正方形),继承自Shape类
class Square(Shape):
    def __init__(self, side):
        self.side = side

    def get_circle(self):
        return self.side * 4

# 创建Triangle类(三角形),继承自Shape类
class Triangle(Shape):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def get_circle(self):        
        return self.a + self.b + self.c

# 创建实例
square = Square(10)
triangle = Triangle(3, 4, 5)
shapes = [square, triangle]

# 不同形状的图形调用同一接口
for shape in shapes:
    print(shape.get_circle())

参考资料

http://www.imooc.com/wiki/pythonlesson1/paradigm.html

posted @ 2022-06-19 02:18  tiansz  阅读(32)  评论(0编辑  收藏  举报