zoukankan      html  css  js  c++  java
  • Python 面向对象学习

    面向过程  与 面向对象

    编程范式

    编程范式是指 用特定的语法+数据结构+算法组成的代码告诉计算机如何执行任务的过程

    两种最重要的编程范式分别为  面向过程编程(PP)  和  面向对象 编程(OOP)

    面向过程编程

    例子  数据库备份   分三步,连接数据库, 备份数据库,测试备份文件可用性

    def db_conn():
            连接数据库
    
    def db_backup(db,name):
            导出数据库
            备份打包 转移目录
    
    def  db_backup_test():
            测试是否备份成功
    
    
    if __name__ == '__main__':
        db_conn()
        db_backup(数据库)
        db_backup_test()

    明显缺点:耦合性太高不易于迭代与维护

    面向对象编程

    OOP编程时  利用 类 和 对象 来创建模型 对 真实世界进行描述

    核心特性:

    Class 类

    类 就是 对一类有相同属性的对象 抽象,蓝图,原型

    Object   对象

    对象 即为   类 实例化后的实例   一个类必须经过 实例化 才能在程序中调用,  一个类可以实例化多个对象,每个对象有不用的属性  (人有指纹 而指纹都不相同)

    Encapsulation   封装

    类 对 数据的复制,内部调用 对 外部用户都是透明的  这使类 变成一个容器,  里面包含类的数据和方法

    Inheritance  继承

    一个类 可以派生出子类 在这个父类里定义的属性 ,方法 自动被子类继承

    Polymorphism  多态

    多态时 面向对象重要的特性    指一个基类 派生出了不同的子类, 每个子类都继承了同样的方法名的同时又对父类的方法做出了不同的实现

    面向对象编程(OOP)  

    无论用什么范式来编程  都要明确以下原则:

      1. 写重复代码 非常低级

      2. 写过的代码要经常变动

    函数式编程与 OOP的主要区别是  程序更加具有扩展性和易更改

    类的基本定义

    class Role(object):# 定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法
            def __init__(self,name,money=16000):  # 初始化函数
                       self.name= name
                       self.money = money

    上面这个额  __init__()叫做构造方法,在类被调用时,这个方法会自动执行,进行初始化动作  

    其中的 self   举例 

    r1 = Role('poet',money=8000)  #此时 self  相当于r1,     Role(r1,'poet',money=8000

    在执行上面r1 = Role('poet',money=8000)时  python解释器工作流程:

      1. 在内存中开辟一块空间 指向 r1这个变量名

      2. 调用  Role这个类 并 执行 __init__() 方法  等价于  Role.__init__(r1,'poet',money=8000)

    这样  self.name 就是为了 将值 存入 实例化的的内存空间中

    面向对象的2.5大特性

    一  封装    

    封装的本质是 明确内外

    面向对象封装的两大特性:

    1 将内容封装  (r1 = Role('poet',money=8000) )

    python 约定私有是人去识别约定   而不是其他语言的强制不能调用

    class Role(object):
            _id = 666
            __id2 = 777  # 自动重命名   _Role__sta
        def __init__(self,name,money=16000): # 初始化函数 
          self.name= name
          self.money
    = money
          self.id = __id2 # 这样也就区分了内外
    r1 = Role('poet',money=8000)
    print(Role.__dirt__)
    r1._id # 约定私有是人去识别约定
    r1._Role__star # 藏的 更深了 直接自动重命名

      1单下划线

        只要属性是  单 下划线开头 就是一个被隐藏起来的属性 _id = 666

      2 双下划线

        __id = 666

        

    2 调用封装的内容形式分为两种:

      通过对象直接调用

    class FOO:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
    obj1 = Foo('poet', 18)
    print(obj1.name)  直接调用 obj1对象的name属性

      通过self简介调用被封装的内容

      

    class FOO:
        def __init__(self,name,age):
            self.name = name
            self.age = age
       def detail():
         print(self.name) obj1
    = Foo('poet', 18)
    obj1.detail() # python会默认将 self 传值 即 obj1.detail(obj1)

    对于面向对象的封装来说  就是使用构造方法将内容封装到对象中, 然后通过 对象直接或者self间接获取被封装的内容

    二 继承

      继承  就是 改变 和 扩展

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

      注:  派生类 和 基类 都是 继承 中 子类和 父类的不同叫法而已

      

        多继承:

            1.在python中可以 继承多个类,  Java C# 只能继承一个类

            2. Python继承多个类时遵循两种 找寻方式    深度优先广度优先

    新式类  广度优先

    class N1(object):
        pass
    
    class N2(N1):
        pass

    经典类  深度优先

    class C1:
            pass
    class  C2(C1):
            pass

    0.5 多态

      多态实际上是依附于继承的两种含义    "改变" 和"扩展"  本身意味着必须有机制去自动选用你改变/扩展过的版本

    一般情况下python开发中, 全部使用 面向对象 或  面向对象和函数式混用

    掌握面向对象 设计利器 :    领域建模  领域建模 领域建模

      1. 发觉重要的业务领域概念

      2. 建立业务领域概念之间的关系

    纵有疾风起,人生不言弃!
  • 相关阅读:
    Rust 1.40.0 发布
    Rust程序交叉编译到aarch64(armv8)目标
    中西的根本区别:理性和感性 贺刚
    使用Rust加速Python
    让你的Python代码更快运行的 5 种方法
    Python基于pyCUDA实现GPU加速并行计算功能入门教程
    用 Psyco 让 Python 运行得像 C 一样快
    illuminate/routing 源码分析之注册路由
    php利用32进制实现对id加密解密
    微信小程序支付全问题解决
  • 原文地址:https://www.cnblogs.com/poetl/p/8378906.html
Copyright © 2011-2022 走看看