面向对象三大特性
继承的概念:子类 拥有 父类 的所有 方法 和 属性

class 类名(父类名):
pass
Dog
类是 Animal
类的子类,Animal
类是 Dog
类的父类,Dog
类从 Animal
类继承Dog
类是 Animal
类的派生类,Animal
类是 Dog
类的基类,Dog
类从 Animal
类派生C
类从 B
类继承,B
类又从 A
类继承C
类就具有 B
类和 A
类的所有属性和方法子类 拥有 父类 以及 父类的父类 中封装的所有 属性 和 方法
提问
哮天犬 能够调用 Cat
类中定义的 catch
方法吗?
答案
不能,因为 哮天犬 和 Cat
之间没有 继承 关系
应用场景

重写 父类方法有两种情况:
具体的实现方式,就相当于在 子类中 定义了一个 和父类同名的方法并且实现
重写之后,在运行时,只会调用 子类中重写的方法,而不再会调用 父类封装的方法
super().父类方法
来调用父类方法的执行super
Python
中 super
是一个 特殊的类super()
就是使用 super
类创建出来的对象在
Python 2.x
时,如果需要调用父类的方法,还可以使用以下方式:
父类名.方法(self)
Python 3.x
还支持这种方式提示
父类名
和 super()
两种方式不要混用
- 私有属性、方法 是对象的隐私,不对外公开,外界 以及 子类 都不能直接访问
- 私有属性、方法 通常用于做一些内部的事情
示例

B
的对象不能直接访问 __num2
属性B
的对象不能在 demo
方法内访问 __num2
属性B
的对象可以在 demo
方法内,调用父类的 test
方法test
方法内部,能够访问 __num2
属性和 __test
方法概念

语法
class 子类名(父类名1, 父类名2...)
pass
问题的提出
提示:开发时,应该尽量避免这种容易产生混淆的情况! —— 如果 父类之间 存在 同名的属性或者方法,应该 尽量避免 使用多继承

Python
中针对 类 提供了一个 内置属性 __mro__
可以查看 方法 搜索顺序method resolution order
,主要用于 在多继承时判断 方法、属性 的调用 路径print(C.__mro__)
输出结果
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
__mro__
的输出结果 从左至右 的顺序查找的
object
是Python
为所有对象提供的 基类,提供有一些内置的属性和方法,可以使用dir
函数查看
object
为基类的类,推荐使用经典类:不以 object
为基类的类,不推荐使用
在 Python 3.x
中定义类时,如果没有指定父类,会 默认使用 object
作为该类的 基类 —— Python 3.x
中定义的类都是 新式类
在 Python 2.x
中定义类时,如果没有指定父类,则不会以 object
作为 基类
新式类 和 经典类 在多继承时 —— 会影响到方法的搜索顺序
为了保证编写的代码能够同时在 Python 2.x
和 Python 3.x
运行!
今后在定义类时,如果没有父类,建议统一继承自 object
class 类名(object):
pass