面向对象编程

  • 程序 = 指令 + 数据

  • 代码可以选择以指令为核心或以数据为核心进行编写

  • 以指令为核心:围绕“正在发生什么”进行编写

  • 面向过程编程:程序具有一系列线性步骤;主体思想是代码作用于数据

  • 以数据为核心:围绕“将影响谁”进行编写

  • 面向对象编程:围绕数据及为数据严格定义的接口来组织程序,用数据控制对代码的访问。

  • 面向过程;程序=算法+数据结构

  • 面向对象:将问题空间中的元素以及它们在解空间中的表示物抽象为对象,并允许实例想象成一种新型变量,它保存着数据,大你可以对自身的数据执行操作。

  • 面向过程:一件事该怎么做

    • 狗.吃(东西)

  • 面向对象:一件事该让谁来做,那个谁就是对象

    • 吃.(狗,东西)

  • 构造对象的方法 new

  • 初始化对象的方法(已经得到了对象 self`) init

__str__ === toString()

类的关系

  • 依赖(uses-a) 一个类的方法操作另一个类的对象

  • 聚合(has-a) 类 A 的对象包含类 B 的对象

  • 继承(is-a) 描述特殊与一般关系

  • 类中的静态变量 可以被对象和类调用

  • 对于不可变数据类型来说,类变量最好用类名操作

  • 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的

  • 类里的名字有 类变量(静态属性量)+ 方法名(动态属性)

  • 对象里的名字 对象属性

  • 对象 ——> 类

  • 对象找名字 : 先找自己的 找类的 再找不到就报错

  • 对象修改静态属性的值

    • 对于不可变数据类型来说,类变量最好用类名操作

    • 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的

组合

一个对象的属性值是另外一个类的对象

继承

  • C.__mro__ 查看C类继承关系

  • 一个类 可以被多个类继承

  • 一个类 可以继承多个父类 —— python里

  • 父类中没有的属性 在子类中出现 叫做派生属性

  • 父类中没有的方法 在子类中出现 叫做派生方法

  • 只要是子类的对象调用,子类中有的名字 一定用子类的,子类中没有才找父类的,如果父类也没有报错

  • 如果父类 子类都有 用子类的

    • 如果还想用父类的,单独调用父类的:

    • 父类名.方法名 需要自己传self参数

    • super().方法名 不需要自己传self

  • 正常的代码中 单继承 === 减少了代码的重复

  • 继承表达的是一种 子类是父类的关系

  • 单继承

    • 先抽象再继承,几个类之间的相同代码抽象出来,成为父类

    • 子类自己没有的名字,就可以使用父类的方法和属性

    • 如果子类自己有,一定是先用自己的

    • 在类中使用self的时候,一定要看清楚self指向谁

  • 多继承

    • 新式类和经典类:

      • 多继承寻找名字的顺序 : 新式类广度优先,经典类深度优先

      • 新式类中 有一个类名.mro方法,查看广度优先的继承顺序

      • python3中 有一个super方法,根据广度优先的继承顺序查找上一个类

      • init() 初始化方法中, super().__init()__ 主动调用

接口

  • raise NotImplemented 抛出异常

Last updated