一、概述
在学习面向对象之前,我们用函数来封装我们的功能,当我们要使用时,就调用函数来实现我们的需求。现在我们学习了面向对象的知识,知道了类和对象,其实函数式编程和面向对象编程都可以减少重复代码,不过面向对象可以对函数进行分类和封装,使代码可读性好,易扩展。那么我们什么时候用到面向对象编程呢?我们先了解一些内容。
- 面向过程:根据业务逻辑从上到下写垒代码
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类和封装,让开发“更快更好更强...”
二、类和对象
面向对象的编程其实就是: 类 + 对象
什么是类,什么是对象?
class Person(object): # Person 就是类 def __init__(self, name): self.name = name p = Person('bigberg') # p 就是对象
类:可以理解为他是一个模板,比如人们在说“人”这个名词的时候,没人知道这个“人”具体是指那个人!
对象: 对象是一个实际的物体,他有自己的属性和特征、行为。比如说 韩梅梅这样一个具体的人。
三、面向对象的适用场景
3.1、提取公共功能
我们以一个数据库连接作为例子
# 连接数据库 def connection(host, username, password, prort, dbname): # 连接数据库 host, username, password, port, dbname pass # 关闭连接 def close_db(): pass exit # 备份数据库 def dump_func(host, username, password, prort, dbname): connection(host, username, password, prort, dbname) # 备份操作 host, username, password, prort, dbname pass close_db # 创建数据库 def create_db(host, username, password, prort, dbname): connection(host, username, password, prort, dbname) # 创建操作
pass close_db # 我们以函数式的方式来实现,当然可以了。可是我们在实现具体功能的时候,都要做一次连接和关闭操作
下面我们用面向对象的方法来实现一下:
class DB_func(object): def __init__(self, host, username, password, port, dbname): self.host = host .... def connection(self): # 连接操作 pass def close(self): # 关闭操作 pass def dump_func(self): # 备份操作 pass def create_db(self): # 创建操作 pass obj = DB_func('ip','user','111111','3306','dbname') # 连接 obj.connection() # 备份 obj.dump_func() # 创建 obj.create_db() #关闭 obj.close # 在这个事例中我们只要在开始时连接数据库,在离开时关闭数据库,中间的过程我们可以做很多其他的操作,但是都不需要重复调用连接和关闭方法
3.2、多个函数传入公共参数
我们还是以上例来做说明,在函数式编程中,每一个函数在执行的时候都需要传入相同的几个参数,即:
dump_func(host, username, password, port, dbname) create_db(host, username, password, port, dbname)
# 每次操作都需要写一遍
我们去类里面调用方法的时候就不要传入参数了么?确实不需要了,python面向对象的最主要特定就是封装。
obj = DB_func('ip','user','111111','3306','dbname') 在实例化的时候我们已经把这些参数传给类了,把它封装到了self中。
如图:
在类的对象当中,不仅存储着这个对象的参数,还有一个隐藏的参数叫做 “类对象指针”,他的作用就是告诉对象,去哪里找方法。
如上图的类中每个方法都有一个self,意思是:obj调用就等于 def dump_func(obj),由于实参是存储在obj这个对象当中的,所以我们每次调用类中的方法时,
就没有必要再传一大推参数了。
看完上面的例子就的想到:如果在一些方法里共同使用了一组变量,如果这时候使用函数式编程,每次调用方法的时候都的传这些参数!
这时候就要想到使用面向对象:把这些变量封装到对象中,每次调用的时候直接传这个对象即可!
3.3 根据一个模板来创建不同的角色
class Person(object): country = 'CN' # 定义一个公有属性 def __init__(self, name, age, gender, province, job): self.name = name # 定义成员属性 self.age = age self.gender = gender self.province = province self.job = job def talk(self): # 定义方法 print('person is talking.....') def walk(self): print('peron is walking...') def eat(self): print('person is eating....')
我们现在创建一个角色的时候:
obj = Person('Stack', 22, 'M', 'ZJ', 'engineer')
如果我们每创建一个人物类型,比较学生、教师等等,每次都有重新写一大堆同样的内容,是不是很麻烦的样子?