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中的重复的参数,只需要传入其他参数即可。

posted @ 2017-08-06 22:28  Mr.hu  阅读(387)  评论(0编辑  收藏  举报