面向对象编程

一、概述

  在学习面向对象之前,我们用函数来封装我们的功能,当我们要使用时,就调用函数来实现我们的需求。现在我们学习了面向对象的知识,知道了类和对象,其实函数式编程和面向对象编程都可以减少重复代码,不过面向对象可以对函数进行分类和封装,使代码可读性好,易扩展。那么我们什么时候用到面向对象编程呢?我们先了解一些内容。

  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

二、类和对象

  面向对象的编程其实就是: 类 + 对象

        什么是类,什么是对象?

  

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')

如果我们每创建一个人物类型,比较学生、教师等等,每次都有重新写一大堆同样的内容,是不是很麻烦的样子?