1.面向对象的三大特征
封装:属性和方法放到类内部,通过对象访问属性或者方法,隐藏功能的实现细节.当然还可以设置访问权限;
继承:子类需要复用父类里面的属性或者方法,当然子类还可以提供自己的属性和方法;
多态:同一个方法不同对象调用同一个方法功能的表现形式不一样,例如:1.不同的两个对象,字符串的加法和整数的加法,同样是加法,实现的功能是不一样的;2.这两个对象之间没有任何直接继承关系,但是所有对象的最终父类都是元类;
1)封装的意义:
1.将属性和方法放到一起做为一个整体,然后通过实例化对象来处理;
2.隐藏内部实现细节,只需要和对象及其属性和方法交互就可以了;
3.对类的属性和方法增加 访问权限控制。
2)继承
主要体现是实现代码的 重用,相同的代码不需要重复的编写;
子类可以在父类功能上进行重写,扩展类的功能。
在面向对象编程中,当我们已经创建了一个类,而又想再创建一个与之相似的类,比如添加几个方法,或者修改原来的方法,这时我们不必从头开始,可以从原来的类派生出一个新的类, 我们把原来的类称为父类或基类,而派生出的类称为子类或派生类,子类继承了父类的所有数据和方法。
从技术上说, OOP里继承最主要的用途是实现多态。对于多态而言,重要的是接口继承性,属性和行为是否存在继承性,这是不一定的。事实上, 大量工程实践表明,重度的行为继承会导致系统过度复杂和臃肿,反而会降低灵活性。因此现在比较提倡的是基于接口的轻度继承理念。这种模型里因为父类(接口类)完全没有代码,因此根本谈不上什么代码复用。
- 单继承
子类的定义如下:
class 子类名(父类名):
<statement-1>
...
<statement-N>
父类名 BaseClassName 对于子类来说必须是可见的。也可以继承在其他模块中定义的父类:
class 子类名(模块名.父类名):
对于子类的属性引用:首先会在当前的子类中搜索,如果没有找到,则会递归地去父类中寻找。
从C++术语上讲,Python 类中所有的方法都是 vitual 的,所以子类可以覆写(override)父类的方法。
在子类中一个覆写的方法可能需要调用父类的方法,可以通过以下方式:
父类名.方法(self, arguments)
- 多继承
Python支持多继承,一个多继承的定义形如:
class 子类名(父类名1, 父类名2, 父类名3):
多个父类有同名属性和方法
子类的魔法属性__mro__决定了属性和方法的查找顺序。如果多个父类中有同名的 属性和方法,
则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)。
子类重写父类的属性和方法
子类和父类的方法名和属性名相同,则默认使用子类的,叫 子类重写父类的同名方法和属性。
使用重写的目的:当子类发现父类的大部分功能都能满足需求,但是有一些功能不满足,则子类可以重写父类方法。
- 调用父类方法
重写之后,如果发现仍然需要父类方法,则可以强制调用父类方法。
方法1. 指定执行父类的方法
无论何时何地,self都表示是子类的对象。在调