看完这篇文章,你的Python基础就差不多了( 七 )

MRO 是 method resolution order —— 方法搜索顺序 , 主要用于 在多继承时判断 方法、属性 的调用 路径
新式类与旧式(经典)类
  • 新式类:以 object 为基类的类 , 推荐使用
  • 经典类:不以 object为基类的类 , 不推荐使用
在 Python 3.x 中定义类时 , 如果没有指定父类 , 会 默认使用 object作为该类的 基类 —— Python 3.x 中定义的类都是 新式类 , 在 Python 2.x 中定义类时 , 如果没有指定父类 , 则不会以 object 作为 基类 。
  • 为了保证编写的代码能够同时在 Python 2.x 和 Python 3.x 运行!今后在定义类时 , 如果没有父类 , 建议统一继承自 object:
class 类名(object):pass
object 是 Python 为所有对象提供的 基类 , 提供有一些内置的属性和方法 , 可以使用 dir(object) 函数查看 。
3.2 多态面向对象三大特性:
  1. 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中 定义类的准则
  2. 继承 实现代码的重用 , 相同的代码不需要重复的编写 设计类的技巧 子类针对自己特有的需求 , 编写特定的代码
  3. 多态 不同的 子类对象 调用相同的 父类方法 , 产生不同的执行结果 增加代码的灵活度 以 继承 和 重写父类方法 为前提 调用方法的技巧 , 不会影响到类的内部设计
多态 更容易编写出出通用的代码 , 做出通用的编程 , 以适应需求的不断变化!
案例:在 Dog 类中封装方法 game:普通狗只是简单的玩耍定义 XiaoTianDog 继承自 Dog , 并且重写 game 方法:哮天犬需要在天上玩耍定义 Person 类 , 并且封装一个 和狗玩 的方法:在方法内部 , 直接让 狗对象 调用 game 方法
看完这篇文章,你的Python基础就差不多了

文章插图
 
多态示例
Person 类中只需要让 狗对象 调用 game 方法 , 而不关心具体是 什么狗 。
 
4. 类属性和类方法4.1 类的结构通常会把:创建出来的 对象 叫做 类的实例创建对象的 动作 叫做 实例化对象的属性 叫做 实例属性对象调用的方法 叫做 实例方法每一个对象 都有自己独立的内存空间 , 保存各自不同的属性多个对象的方法 , 在内存中只有一份 , 在调用方法时 , 需要把对象的引用传递到方法内部
看完这篇文章,你的Python基础就差不多了

文章插图
 
各个不同的属性 , 独一份的方法
在 Python 中 , 类是一个特殊的对象 。
Python 中 一切皆对象:
class AAA: 定义的类属于 类对象 obj1 = AAA() 属于 实例对象
在程序运行时 , 类同样会被加载到内存在程序运行时 , 类对象在内存中只有一份 , 使用 一个类可以创建出很多个对象实例除了封装实例的属性和方法外 , 类对象还可以拥有自己的属性和方法——类属性、类方法 , 通过 类名. 的方式可以 访问类的属性 或者 调用类的方法
看完这篇文章,你的Python基础就差不多了

文章插图
 
类的结构
4.2 类属性和实例属性类属性 就是 类对象中定义的属性通常用来记录与这个类相关的特征类属性不会用于记录具体对象的特征示例:定义一个 工具类 , 每件工具都有自己的 name:需求 —— 知道使用这个类 , 创建了多少个工具对象?
 
看完这篇文章,你的Python基础就差不多了

文章插图
 
 
属性的获取机制在 Python 中 属性的获取 存在一个 向上查找机制
看完这篇文章,你的Python基础就差不多了

文章插图
 
 
因此 , 要访问类属性有两种方式:
  • 类名.类属性
  • 对象.类属性 (不推荐 , 因为如果使用 对象.类属性 = 值 赋值语句 , 只会给对象添加一个属性 , 而不会影响到类属性的值)
4.3 类方法和静态方法4.3.1 类方法