复习重点:
1.只要对象的某个属性被直接赋值,那么一定是对象的命名空间发生变化。
2.只要是静态变量,就用类名直接操作它。
面向对象的三大特性——继承
1.继承和抽象
抽象:抽取事物类似或者比较像的的部分。
继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。
2.单继承
#继承与重用:
父类中的属性和方法都可以被子类使用。
#继承与派生
定义:子类在父类的基础上又新创建了自己需要的方法和属性。
1.当子类中又要被调用的方法时,子类对象会直接选择子类中的方法或者变量,
2.父类中的变量和方法不会被自动执行
3.如果我们既想要执行子类方法,也想执行父类的方法,那么需要在子类的方法中调用父类的同名方法。
4.调用方法:
1)父类.方法名(self,...)需要传入self
2)super().方法名(...)不需要传入self
3)情况分析:
(1)子类有的父类没有:这个时候直接对象直接使用子类的属性或者方法。
(2)子类有的父类也有:如果对象需要使用子类的方法或属性可以直接调用,但是如果需要调用父类的方法或者属性就需要使用:父类.方法名(self,...)需要传入self或者super().方法名(...)不需要传入self。
#规范的编程模式
#抽象类
1,运用场景:多人开发、复杂的需求、后期的扩展在工作中;
2,应用:
抽象类是一个规范它基本不会实现什么具体功能,抽象类是不能被实例化的
3,步骤
1.在文件头声明:from abc import ABCMeta,abstractmethod
2.在抽象类创建的时候指定metaclass = ABCMeta
3.在类中需要规范子类的函数头前加上装饰器@abstractmethod
3.多继承
#语法
不是所有语言都支持多继承,java就不支持,C++就支持多继承
#接口类
python中允许多继承的使用,所以不需要使用接口
#新式类和经典类
在python3中,所有类都是新式类,所有的新式类都有一个默认的父类:object
而在python2x中,在2.7中经典类和新式类并存。
在python2中:
class Studet:pass被默认为经典类
要变成新式类必须这样写:class Studet(obj):pass
#多继承的顺序,新式类和经典类的区别
新式类中的所有的多继承关系寻找方法的顺序为广度优先,遵循mro算法
注意:super不是单纯的找父类,而会遵循mro的顺序
python2中不提供mro和super
新式类和经典类的区别:
新式类:
1)所有的多继承关系寻找方法的顺序—遵循广度优先算法;
2)继承object;
3)mro方法;
4)super:super不是单纯的找父类,而是遵循mro顺序。
经典类:
1)python2.x
2)不主动继承object
3)经典类在找父类中方法的过程中—遵循深度优先算法;
4)不提供mro方法和super