面向对象编程
面向对象--Object Oriented Programming,简称oop,是一种程序设计思想。在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一个功能。举个例子,你要做饭,可以用电磁炉,也可以用煤气灶。不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,两种最重要的编程范式分别是面向过程编程和面向对象编程。
提到面向对象,就不得不提到另一种编程思想,面向过程;什么是面向过程呢,面向过程的思想是把一个项目、一件事情按照一定的顺序,从头到尾一步一步地做下去,先做什么,后做什么,一直到结束。这种思想比较好理解,其实这也是一个人做事的方法,我们之前编程的思想也都是使用这种思想。这种编程思想,只要前面有一个步骤变了,那么后面的就也要变,后面维护起来比较麻烦,这样的编程思想,我们在写一些简单的小程序、只执行一次的脚本时可以使用。而面向对象呢,面向对象的思想是把一个项目、一件事情分成更小的项目,或者说分成一个个更小的部分,每一部分负责什么方面的功能,最后再由这些部分组合而成为一个整体。这种思想比较适合多人的分工合作,就像一个大的机关,分各个部门,每个部门分别负责某样职能,各个部门可以充分发挥自己的特色,只要符合一定前提就行了。
举个例子:比如刚才说的一个大的机关,要做某一个项目,从面向过程的思想来说,应该是这样分析的,先怎么样,再怎么样,最后怎么样。第一样应该如何完成,第二样应该如何完成等等。等到每一步骤都完成,项目也就完成了。而面向对象的思想则应该是这样想的,这个项目是由几个部分组成的,我们就做好分工,成立一个部门来做一个部分的功能,另一个部门来做另一个部分。各个部门可以不用理解其他部门的事,只要完成自己那一部分的事情就OK了。
面向对象的特性
类:class
类就是一个种类、一个模型
定义类首字母大写
在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
实例/对象:object
实例或者对象就是根据模型制作出来的东西
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同。
实例化
就是做东西的这个过程
类
属性
类里面的变量
类变量
就在直接在类下面定义的变量,没有加self的,每个实例都可以用。
修改类变量:通过类名来修改类变量。或者通过实例来修改类变量
实例变量
self.xxx = xxx 加了self的变量才是实例变量,必须得实例化之后才可以使用
构造函数 /构造方法
类在实例化的时候会自动执行的一个函数
析构函数
实例在销毁的时候自动执行的函数,什么时候销毁?实例化之后,代码运行,直到没有代码可以执行了,变量都是存在内存里的,内存中没有这个变量了,就是销毁了
self的作用
代表的是本类对象,即代表实例。
id(self)=id(实例):即self与实例化出来的实例的内存地址相同,即他俩是一个东西。
一个变量前面加了self之后,那么在这个类里面的其他的函数都可以用了。
也可以在类函数里面调用另一个函数,也得用self.函数()
方法:类里面的函数
类方法
1、不需要实例化就可以调用
2、它可以使用类变量
3、调用其他的类方法。
4、它不可以使用实例方法、实例变量
如果类里面的这个方法,它并没有使用到其他的实例变量、或者其他实例方法,那么就给他定义成类方法
5、实例方法可以调用类方法,类方法不可以调用实例方法。
不可以调用实例方法,会报错
实例方法里面可以通过self.来调用类方法
也可以通过实例来直接调用类方法
实例方法
需要传self的方法,都是实例方法,必须得实例化之后才可以使用
实例方法里面可以随便通过self来调用实例方法,类方法,静态方法,类变量。
静态方法
1、不需要实例化就可以调用的
2、它就是一个定义在类里面的普通函数,不能使用实例变量、实例方法、不能使用类变量、类方法。
3、它就是定义在类里面的公共方法,谁都可以调用,可以直接用累调用,可以用实例来调用,可以在类方法里面用cls.来调用
4、打印一些帮助文档之类的可以用静态方法
属性方法
看起来像变量的一个方法。调用属性方法时函数名后面不需要加()
私有
变量、函数,前面加两个下划线就代表是一个私有的,只能在类里面用。
什么是私有,私有就是只有在类里面可以访问,实例化之后不可以访问和调用,有私有方法和私有属性。私有就把变量名或者函数名前面加上"__"两个下划线,其实就是通过私有来实现封装的。
继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。比如说你继承了你父亲的姓。
python3中多继承都是广度优先,python2中经典类的多继承是深度优先,新式类的多继承是按照广度优先的。
继承是为了代码的重用
super():找到父类的方法,在父类的功能基础上增加新的功能,原来父类有的功能还想保留,但是还想增加新的方法。
super代表父类这个类名
在父类某个方法的基础上再增加新功能:
super().xxx()
super()会自动找到父类