zoukankan      html  css  js  c++  java
  • 面向对象

    一、   理解面向对象

    面向对象和面向过程都是一种思想。

    面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步的实现。面向过程强调的是功能行为。

    面向对象是将功能封装进对象,强调的是具备了功能的对象

    例如:“做蛋炒饭吃”

    面向过程的思想就是:自己在家里面开火、放油、打鸡蛋、搅拌鸡蛋、放鸡蛋炒、下饭炒……起锅、关火

    面向对象的思想就是:建立三个对象: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://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820044406b227b3e751cc4d5190420d17a2dc6353000

    https://zhidao.baidu.com/question/2089034.html

  • 相关阅读:
    模仿jquery框架源码 -成熟---选择器
    模仿jquery框架源码---网络
    jquery链式语法
    jquery跟DOM转换
    jquery选择器
    基本jquery
    滚屏加载--无刷新动态加载数据技术的应用
    CenterFactory
    IImage--factory
    redis的使用及方法
  • 原文地址:https://www.cnblogs.com/ruijie/p/9084347.html
Copyright © 2011-2022 走看看