首页 > 代码库 > 面向对象

面向对象

  

一、编程模式

面向过程  根据业务实现流程和逻辑,逐步完成

函数式编程  将功能写入函数,方便调用

面向对象  将函数打包,用类封装,实现更强大功能,更符合人对世界的认知过程

 

二、面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)的实现过程

 类是个封装器,是用来封装方法和数据的。

不是所有情况都适用面向对象编程。

 技术分享

 

 

 class 类名:

  def 方法(self,arg):    #self形式参数不能省略

    pass

obj = 方法()    #创建实例/对象,对象实现类中的方法

 

 

class lei:
    def fetch(self):
        print(self.backend)

    def add_record(self):
        print(self.backend)

    def del_record(self):
        print(self.backend)

obj = lei()
obj.backend = "www.baidu.com"  #在对象中封装数据
obj.fetch()
obj.add_record()  #执行方法,执行过程中根据self去obj对象中读取已经封装的数据
obj.del_record()

"""
www.baidu.com
www.baidu.com
www.baidu.com
"""

 

  • 面向对象:【创建对象】【通过对象执行方法】
  • 函数编程:【执行函数】

函数式编程的应用场景 --> 各个函数之间独立且无共用的数据

 

三、面向对象三大特性

封装、继承和多态。

 

封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

  • 将内容封装到某处
  • 从某处调用被封装的内容

 

继承

子类继承父类

某一只狗就是只是狗中的一员,不会是猫,不克隆有猫的那些共有特征和能力。

对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

 

技术分享

 

 

派生类可以继承基类中所有的功能

派生类和基类同时存在,优先找派生类

 

 

python类可以同时继承多个类(C#,Java不可以)
优先:自己,左边,右边

 

 

多继承

技术分享技术分享

 

 

 

扩展:
  重载:函数名相同,参数个数不同(python不支持)
  重写:派生类中重新实现基类中的方法

 

 

 

 

 

多态

 多态就是多种形态。

python是原生多态。

 

 

类+括号  >>> 自动执行类中的__init__方法

在__init__方法中执行具体封装的操作

__init__有一个特殊的名字:构造方法     >>>初始化

 

__del__ 解释器销毁对象的时候自动调用,特殊的名字:析构方法

 

 

封装:

使用场景:当同一类型的方法具有相同的参数时,直接封装到对象即可。

使用场景:把类当作模板,创建多个对象(对象内封装的数据可以不一样)

 

 

 

单例模式

单个实例。

 

使用场景:

  创建的实例都是一样的,没有必要在内存中保存多份,可归结为一个对象。

  数据库链接池

  实现方式:静态方法 + 静态字段

 

class ConnectionPoll:
    __instance = None

    def __init__(self):
        self.ip = "1.1.1.1"
        self.port = 3306
        self.pwd = 123
        self.username = "root"

        self.conn_list = [1,2,3,4,5,6,7]

    @staticmethod
    def get_instance():
        if ConnectionPoll.__instance:
            return ConnectionPoll.__instance
        else:
            ConnectionPoll.__instance = ConnectionPoll()
            return ConnectionPoll.__instance

obj1 = ConnectionPoll.get_instance()
print(obj1)
obj2 = ConnectionPoll.get_instance()
print(obj2)

"""
<__main__.ConnectionPoll instance at 0x026315D0>
<__main__.ConnectionPoll instance at 0x026315D0>
"""

 

面向对象