仅用学习参考
后面的继承跟着动
面向对象三大特性
继承的概念:子类 拥有 父类 的所有 方法 和 属性
经典动物类继承
class 类名(父类名):
pass
class Child(Father):
pass
Dog
类是 Animal
类的子类,Animal
类是 Dog
类的父类,Dog
类从 Animal
类继承Dog
类是 Animal
类的派生类,Animal
类是 Dog
类的基类,Dog
类从 Animal
类派生
3) 继承的传递性
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