初始继承之顺序/深度优先及广度优先


面向对象的三大特性:继承,多态,封装
初识别继承:
                 作为继承者的类的定义时,在这个类名的括号内加入被继承的类的名字,被继承的类被称为父类或基类,继承者被称为子类

                 使用子类类名及其实例化产生的对象,可以访问父亲的任何方法或变量

执行的顺序是先找对象,再找类,再找父类.也就是说:

如果想只执行父类的方法,则子类中不要定义父类同名的方法
如果想只执行子类的方法,在子类中单独创建这个方法即可
既要执行父类的方法又要子类的话:
1.

如果两个父子都有init,先且只执行子类的)在子类的init里,使用类名调用父类的init,被调用的父类的init形参需要加到子类的init定义里
子类的就完成了形参变实参的过程,子类中的self在实例化时自动变成对象(名),调用父类就是普通的执行函数。是一个嵌套函数的过程。
2.
super().i方法名(参数,除self)
效果一样,且工作中只用后者,括号内可省略,一般不用1.这种类名.方法。

真正的继承:分为单继承和多继承。
类:经典类和新式类
凡是继承object的类都是新式类,python3里的都是新式类
不继承object的是经典类,只存在于python2,2.x中默认都不继承object.

对于继承的顺序而言:

单继承,两种类的查询顺序一样,一层一层往上找
多继承,新式类:遵循广度优先;经典类:深度优先。
广度优先:每个节点,走且只走一次。在一条路进行到倒数第二层时,如果最终的基类别的路能达到,就换;不能就走完这个类。一条路走到倒数第二级开始判断,如果其他路可以走到终点就切换到那条,不然就继续走。

在工作中,使用类名.mro()查询类的继承顺序即可。上述内容是面试题需要.

深度优先:一条路走到黑,就走就行.

原文地址:https://www.cnblogs.com/shachengcc1/p/11135554.html