面向过程和面向对象
首先需要明确面向过程和面向对象是两种不同的编程思想,而不是新的技术栈。
面向过程编程
面向过程是一种编程范式,它将程序设计看作一系列按照特定顺序执行的操作或函数调用。在面向过程编程中,程序主要由一系列的函数或过程组成,这些函数按照一定的顺序依次执行,以完成特定的任务。
面向过程编程的特点包括:
-
以过程为中心: 程序的主要结构是一系列的函数或过程,它们以特定的顺序执行。
-
数据和操作分离: 数据和操作(或函数)分开管理。数据通常是以简单的数据结构(如数组、结构体,列表,字典等)来组织,而操作则由一系列的函数来执行。
-
强调线性流程: 程序的执行流程通常是线性的,即从一个步骤到下一个步骤,依次执行。
-
适合简单任务: 面向过程编程通常适用于较为简单、直接的任务,不涉及复杂的数据交互和状态管理。
-
相对低级: 面向过程编程通常比面向对象编程更接近计算机硬件和底层操作,因此在一些性能敏感的场景中可能更具优势。
-
可读性较差: 面向过程的代码可能会变得比较冗长,特别是在处理复杂任务时,代码可能会难以维护和理解。
示例代码(使用C语言):
def add(a, b):
return a + b
x = 5
y = 3
result = add(x, y) # 调用add函数
print(f"{x} + {y} = {result}")
}
在上面的例子中,add
函数是一个典型的面向过程的例子。它接受两个参数 a
和 b
,然后返回它们的和。
总的来说,面向过程编程是一种简单直接的编程范式,适合于一些不需要复杂数据交互和状态管理的任务。然而,在处理大规模、复杂的程序时,面向对象编程等其他范式可能更具优势。
在此之前写的程序都是面向过程编程
面向对象编程
面向对象编程(Object-Oriented Programming,OOP)是一种常用的编程范式,它将程序中的数据和行为封装成对象,使得代码更具有组织性、可维护性和复用性。
以下是面向对象编程的一些基本概念和特点:
-
类和对象:
- 类(Class) 是一个抽象的概念,它代表一类事物的共性特征,包括它们的属性和行为。
- 对象(Object) 是类的一个具体实例,它具有该类所定义的属性和行为。
-
封装(Encapsulation):
- 封装是一种将数据和操作打包在一起的机制,目的是保护数据,防止它被不恰当地访问或修改。
- 通过封装,我们可以将数据的实现细节隐藏起来,只提供公共的接口供外部访问。这样可以降低系统的耦合度,使得修改某一部分的实现不会影响到其他部分。
-
继承(Inheritance):
- 继承是一种机制,允许一个类(称为子类)继承另一个类(称为父类)的属性和行为。
- 子类可以继承父类的公共成员,并且可以在继承的基础上进行扩展或者修改。
例如,如果我们有一个
Animal
类,其中有一个方法叫做eat()
,我们可以创建一个子类Dog
,它继承了Animal
类,但可能会添加自己的方法如bark()
。 -
多态(Polymorphism):
- 多态性允许不同的类实现相同的方法名,但具体执行的行为可能不同。
- 这使得我们可以使用通用的接口来处理不同类的对象,而不需要关心它们的具体类型。
举例来说,我们可以定义一个统一的
speak()
方法,然后让不同的动物类(如狗、猫)实现自己特定的speak()
行为。 -
抽象类和接口:
- 抽象类是一种不能被实例化的类,它只能作为其他类的基类,用于定义一些共性的属性和方法。
- 接口是一种特殊的抽象类,它只包含方法的签名而不包含实际的实现。
抽象类和接口都用于描述对象的共性特征,但接口更加抽象,通常用于定义规范,而不涉及具体的实现。
以上是面向对象编程的核心概念,它们提供了一种强大的方式来组织和管理复杂的程序。通过合理地应用这些概念,我们可以写出模块化、可扩展、易维护的代码,从而提高程序的质量和可重用性。
面向对象编程的优点包括:
- 代码复用性:通过继承和组合,可以更轻松地重用现有的代码,减少了代码的重复编写。
- 可维护性:封装使得对象的内部实现对外部用户透明,可以更容易地对代码进行维护和更新。
- 模块化:将代码模块化成类和对象,使得程序结构更清晰,易于组织和管理。
- 拓展性:通过继承和多态,可以在不修改已有代码的情况下,拓展程序的功能。
总的来说,面向对象编程是一种强大的编程范式,它在现代软件开发中得到了广泛应用。许多流行的编程语言,如Java、Python、C++等,都支持面向对象编程。
Python中的面向对象编程
在Python中想要通过面向对象去实现某个或某些功能时需要2步:
定义类,在类中定义方法,在方法中去实现具体的功能。
实例化类并的个一个对象,通过对象去调用并执行方法。
示例如下:
# 创建类并在类中定义方法
class Message:
def send_email(self, email, content):
data = "给{}发邮件,内容是:{}".format(email,content)
print(data)
def send_wechat(self, vid, content):
data = "给{}发邮件,内容是:{}".format(vid,content)
print(data)
msg_object = Message() # 实例化了一个对象msg_object
msg_object.send_email("antony@gmail.com","用户成功注册")
msg_object.send_wechat("张三","法外狂徒")
注意:
1.类名称建议采用大驼峰式命名;
2.py3之后默认类都继承object;
3.在类种编写的函数称为方法;
4.每个方法的第一个参数是self。
此时能明确感受到类是对方法的归类:即相同类型的函数划分到一个类中。
到现在为止面向对象给人的感觉就是很鸡肋,甚至不如直接使用函数编写。那么接着往下看:
对象和self
在每个类中都可以定义个特殊的:__init__
初始化方法 ,在实例化类创建对象时自动执行,即:对象=类()
。
class Message:
def __init__(self, content):
self.data = content
def send_email(self, email):
data = "给{}发邮件,内容是:{}".format(email, self.data)
print(data)
def send_wechat(self, vid):
data = "给{}发微信,内容是:{}".format(vid, self.data)
print(data)
# 对象 = 类名() # 自动执行类中的 __init__ 方法。
# 1. 根据类型创建一个对象,内存的一块 区域 。
# 2. 执行__init__方法,模块会将创建的那块区域的内存地址当self参数传递进去。 往区域中(data="注册成功")
msg_object = Message("法外狂徒")
msg_object.send_email("antony@gmail.com")
msg_object.send_wechat("张三")
通过上述示例:
对象,让我们可以在它的内部先封装一部分数据,以后想要使用时,再去里面获取。
self,类中的方法需要由这个类的对象来触发并执行( 对象.方法名 ),且在执行时会自动将对象当做参数传递给self,以供方法中获取对象中已封装的值。
注意:除了self默认参数以外,方法中的参数的定义和执行与函数是相同。
面向对象的思想:将一些数据封装到对象中,在执行方法时,再去对象中获取。
函数式的思想:函数内部需要的数据均通过参数的形式传递。