day6-面向对象补充之使用场景
面向对象知识回顾
1.什么是面向对象编程?
- 以前使用的是函数
- 现在面向对象使用的是:类 + 对象
2.什么是类,什么是对象?
你不要把它看作是一个牛逼的东西,我们给它一个简单的定义,它其实就是以前我们学过的函数的集合。
- 函数式编程:每个模块里面有很多实现各种功能的函数(模块-函数)
- 面向对象编程:最外层是模块,模块里面包含Class-类的东西,类里面包含一个个的函数def(模块-类-函数)
实际上面向对象编程相比函数式编程,只是把函数def又往内层缩了一层,外面用类对其进行了包装。
调用的区别
- 函数式编程:首先定义好实现某种功能的函数,即将功能封装到函数里面,然后在使用到该功能的地方进行调用,就实现了该功能
- 面向对象编程:首先将函数在类Class里面定义好,我们还是赋予此函数某种功能,然后去调用它就行了,只不过,现在要调用类Class里面的函数的话,不能够直接调用,需要借助一个可以访问该函数的一个对象去调用,所以我们第一步需要根据类—>创建对象
class 类名: def 函数1(): pass def 函数2(): pass # obj是对象,是一个实例化的 obj = 类名() obj.函数1()
由此可见,在使用面向对象编程时,我们如果想要访问一个函数,先创建类—>再创建一个对象—>通过对象去调用一个方法即函数(功能),所以,在调用函数的过程中,它需要2步,而且,我们创建的对象也要存放在内存中,这样的话,我们每调用一个函数都需要首先创建一个对象,这样内存消耗也大;而在函数式编程中只需要调用即可。现在看来,函数式编程要优于面向对象,那么,为什么要用面向对象编程呢?
有时候,函数式编程能实现,但是很麻烦,而面向对象就能非常简单就能实现。
下面我们通过一个例子进行分析:
假设我们要ssh登上一台服务器,需要调用一个模块才能登陆上此服务器,登上服务器执行命令,上传文件
需求:
1.单独执行命令:1.连接服务器,2.执行命令,3.断开连接
2.单独上传文件:1.连接服务器,2.上传文件,3.断开连接
3.先上传文件,然后再执行命令:1.连接服务器,2.上传文件,3.执行命令,4.断开连接
def upload(): #1 #连接服务器 #上传文件 #断开连接 def cmd(): #2 #连接服务器 #执行命令 #断开连接 def upload_cmd(): #3 #连接服务器 #上传文件 #执行命令 #断开连接
可以看出我们在执行命令和上传文件时,执行了两次连接服务器,即使我们对前两种进行融合变成第3种,在函数式编程中,三种方法都重复的执行了连接服务器,关闭的代码,我们的确可以实现功能,如果在面向对象中,就非常简单了。
使用场景
1.提取公共功能
用法:我们把一些公共的功能,可以提取出来,并且在公共的功能中创建属于这个对象的属性,然后其他的方法就可以使用这个对象的属性了
class SSH: def __init__(self,host,port,pwd,username): self.host = host .... def connection(self): #只去创建连接 self.conn =和服务器创建的连接对象() def close(self): #用于关闭 self.conn.关闭 def upload(self): self.conn #使用连接上传文件 def cmd(self): self.conn #使用连接执行命令 需求1: obj = SSH(...) #创建对象 obj.connection() #通过实例化的对象调用方法(函数) obj.upload() obj.close() 需求2: obj = SSH(...) #创建对象 obj.connection() obj.cmd() obj.close() 需求3: obj = SSH(...) #创建对象 obj.connection() obj.upload() obj.cmd() obj.close()
解析:
- 在使用面向对象编程后,这些操作可以随意组合,也只使用一个连接,同时连接也封装到该对象中
- 在SSH()里面可以传各种参数如host,port,实现登陆不同的机器,而不必修改源代码,所以,面向对象编程的可扩展性强
2.根据一个模板去创建某种东西
用法:我们用面向对象,其实就是建立一个模板,比如说见一个person类,通过这个person类去实例化很多对象,子类继承它的时候,也可以重用一些属性和方法。
3.多个函数须传入公共的参数
用法:当很多的函数需要有公共的参数时,可以吧参数提取出来,封装到对象中,便于以后方便使用
首先我们看一个例子:
def f1(host,port,pwd,arg): pass def f2(host,port,pwd,arg,arg2): pass def f3(host,port,pwd,arg,arg2): pass
由例子可以看出三个函数都用到了host,port,pwd,arg这四个参数,那我们就可以将这3种方法放入一个类中,同时对于其公共的参数把它封装到对象中:
class Foo: def __init__(self,host,port,pwd): self.host = host self.port = port self.pwd = pwd def f1(self,arg): self.host self.port self.pwd def f2(self,arg,arg2): self.host self.port self.pwd def f3(self,arg2,arg3): self.host self.port self.pwd obj = Foo(1,1,1) #1 obj.f1(2) obj.f2(2,3) obj.f3(3,4)
解析:在使用面向对象编程中,虽然在创建类的过程中比较麻烦,但是在后面的使用的时候,如#1中,我们将第一次的参数传进去,后面调用方法时不需要再传入#1中的重复的参数,只需要传入其他参数即可。