一、 理解面向对象
面向对象和面向过程都是一种思想。
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步的实现。面向过程强调的是功能行为。
面向对象是将功能封装进对象,强调的是具备了功能的对象
例如:“做蛋炒饭吃”
面向过程的思想就是:自己在家里面开火、放油、打鸡蛋、搅拌鸡蛋、放鸡蛋炒、下饭炒……起锅、关火
面向对象的思想就是:建立三个对象:1、服务员:负责点单,接受你的菜单,将菜单交给厨师、将厨师做的饭交给你 2、厨师:接受服务员的菜单,炒饭,将炒好的饭交付给服务员 3、规则:定义炒饭的步骤规则
从上可以看出,面向对象是以功能来划分问题,而不是步骤;
面向对象的设计扩展性很好,简化开发且提高了复用;例如想要将炒饭变成汤面,则只需要修改规则对象即可;同时整个对对象功能的调用顺序没有变化,改动只是局部的。
面向对象将程序员从执行者转换成了指挥者,完成需求时,先去找具有所需的功能的对象来用,如果此对象不存在,则创建一个具有此功能的对象。
二、 类
1、类和对象的关系
类(class)是用来描述事物的,可以将它视为种类和类型的同义词。所有的对象都是属于某一种类,对象是该类事物实实在在存在的个体。
类是将对象共性的内容进行抽取。
生活中描述事物无非就是描述事物的属性和行为:如人有身高、体重、姓名、年龄等属性,有说话、走路等行为。
类(class)描述事物也是如此:
属性:对应类中的变量;行为:对应类中的方法
2、一些基本概念
2.1 实例化
根据一个类创建一个具体的对象的过程,叫做实例化。
2.2 属性
类中的变量,类中变量分为实例变量和类变量;实例变量也叫成员变量;
类变量和实例变量的区别:
1) 生命周期不同:类变量随着类的加载而存在,随着类的消失而消失;实例变量随着对象的创建而存在,随着对象的回收而释放;
2) 调用方式不同:实例变量只能被对象调用;类变量可以被对象调用,也可以被类名调用;
一旦通过类名.类变量的调用将类变量的值修改了,则所有对象的此类变量值都修改了
2.3 方法
就是类中的函数,它实现了某种功能
2.3.1 构造方法
构建创造对象时调用的函数;作用:给对象初始化
2.3.2 析构方法
在对象被垃圾回收之前自动调用,但是发生调用的具体时间是不可知的;
2.3.3 实例方法
类内部定义的,没有装饰器且第一个参数是self的函数;
实例方法只能被对象调用。
2.3.4 类方法
类内部定义的,以装饰器@classmethod装饰、第一个参数是cls的函数;
类方法既可以被对象调用,也可以直接被类调用;
可以使用“cls.变量名”调用类变量。等价于“类名.变量名”;
不能调用类中的实例方法和实例变量。
2.3.5 静态方法
类内部定义的以@staticmethod装饰的函数,没有cls或者self参数;
静态方法既可以被对象调用,也可以直接被类调用;
不能调用类中的实例方法和实例变量。
2.3.6 属性方法
类内部定义的以@staticmethod装饰的函数,第一个参数为self;
除了self参数,不能有别的参数;
使用对象调用执行;
调用属性方法同调用类变量,即方法后面不能有“()”
2.3.7 私有变量和私有方法
变量名和函数名之前有两个下划线就是私有的,不能在class之外访问该变量和该函数
私有的过程:
类中所有双下划线开头的名称(如__x)都会自动变形成_类名__x的形式;
类中定义的__x只能在内部使用,如self.__x,引用的就是变形后的结果;
这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的;
所以私有并没有真正的限制从外部访问属性,我们通过变形就可以访问:
在子类定义的__x不会覆盖在父类定义的__x,因为子类变形成:_子类名__x,父类变形成_父类名__x;即双下划綫开头的属性在继承给子类时,子类无法覆盖;
2.4 self
1)self代表的是对象,哪个对象调用了self所在的方法,self就代表了那个对象
2)self并不是规定死的,只是约定的
3)self在定义时,需要定义,但是调用时会自动传入
2.5 if __name__ == '__main__'
判断这个python是在别的地方导入的,还是直接运行的这个python文件
这句话一般是做调试的时候用的。
1、 如果是直接运行这个python文件的时候,这句话一点用都没有,会依次执行下面的代码
2、 如果是导入的,就不执行下面的代码
三、 面向对象的特征
面向对象有三个特征:继承、封装、多态
1、封装
封装是指隐藏对象的属性和实现细节,仅对外访问公共访问方式。
封装数据的主要原因:保护隐私
封装方法的主要原因:隔离复杂度,比如电脑,电脑本上有许多硬件和软件,对于用户来说,我们不需要清楚里面有什么硬件和软件;电脑将这些元件封装起来,只提供给我们数据插口和按钮接口,通过这些接口我们就能实现对电脑的操作。
分装分为两个层
第一层层面的封装:创建类和对象会分别创建两者的名称空间,我们用类名.或者对象名.的方式去访问里面的名字,这本身就是一种封装
对于这一层的封装,类名.和对象.就是访问隐藏属性的接口
第二层层面的封装:类中把某些属性和方法私有化,只能在类的内部使用,外部无法使用。
2、 继承
继承是另外一种懒惰(褒义)的行为。
如果现在有了一个类,但是又想建立一个非常类似的类,新的类可能只是添加了几种方法或者修改了一些方法;例如现在已经有一个叫做shape的类。此类有个draw方法可以在屏幕上画出指定的形状;现在需要一个叫做Ret的类,此类不仅可以画出指定的形状,还可以计算该形状的面积;那么我们就可以让Ret继承Shape类,在Ret对象上调用draw方法时,程序会自动从Shape类调用该方法。
那么被继承的Shape类就是父类;Ret就是子类
若是子类属性和方法需要改变时,可以复写(覆盖)父类属性和方法
3 多态(没讲)
参考网站:
https://www.cnblogs.com/Michael--chen/p/6740455.html
https://zhidao.baidu.com/question/2089034.html