六、对象和内存分析

面向过程思想:
         面向过程通过过程组成编程,遇到事情,第一步,第二步。。。。,不需要协作,适合小规模的程序,比如开车。
面向对象思维
       面向对象通过对象组成编程,比如造车,第一步,第二步。。。。,无法确定,需要大规模的协作,有设计者的思维,拆分成一个个个体,造轮胎的厂家、发动机的厂家、车壳、座椅 、挡风玻璃等等。当然,分成这些块以后,就是一个个的过程去实现。

综上:遇到复杂问题,用面向对象思考,找名词,确定各个名词的关系;面向过程思考,找动词,在面向对象设计好了以后,底层还是过程,执行者的思维。面对不同的问题,采取不同的思维。

对象的进化

    数据在不断的进化中,出现了对象这个概念;将一类数据放在一起和处理这些数据的方法 ,统称为对象。

类:
 内存分析:

        类是对象的模型。通过定义的对象调用类,执行了两个方法,一个是new一个对象,这个对象有自己的地址,另外一个是构造方法,对于创建的对象进行初始化,根据类名找到类的地址,将对象的地址传递到类名中,所有类中的数据方法,构造成了此对象。通过引用传递给变量名。则变量名就有了这个对象的地址,通过变量名,找到这个对象,找到对象的方法和数据。例如:c=Student("djw",124),解释器会翻译成:Student.方法(c);类是模型,方法是共享的,具体的c就是对应的地址,具体对象的行为结果。

 python中一切皆对象,类也是一个对象,叫类对象。

类属性:

    类属性可以在初始化__init__或者方法中,但是在内存中,是在类的内存区域内的。

    类方法是从属于类的方法,classmethon

    静态方法和普通的方法没有什么区别,就是在类中定义的一个方法。

"析构方法":

    __del__方法和垃圾回收机制:
    __del__方法称为"析构方法",用于实现对象被销毁时所需的操作,当对象没有被引用时(引用计数为0),垃圾回收机制就会调用__del__方法。
    del语句的底层也是调用的__del__语句。

 __call__方法:

    函数可以被调用,底层就是call方法,所以对象的调用调用__call__方法,就可以向函数一样任意被调用了。

    python没有重载方法,因为参数是没有类型,以最后一个方法为主,之前的都会被覆盖掉。
方法的动态性:
    python是动态语言,我们可以为类添加新方法,或者动态的修改类的已有方法。

私有属性:

   私有属性的定义是:(__变量名)进行定义的。调用也是需要_类名__变量名

   私有方法的定义是:__方法名()进行定义的,调用也是_类名__方法名进行调用的。

装饰器:

   对象调用类里面的装饰器,可以通过点的方式调用,类似对象的属性,set和get方式进行调用。

继承:
      继承是代码复用的重要手段,父类或者基类有的,派生类或者子类都有,具备父类的特征。在类中没有指定父类,则默认父类是object类。父类私有方法或者属性,子类继承,但是不见得可以用,但是可以通过对象._父类__age的方式进行调用私有方法或者属性。
    重写:子类继承了父类除构造方法之外的所有成员。子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为"重写"。

    1)通过类的方法mro()或者类的属性_mro_()可以输出这个类的继承层次结构。

       mro()函数,如果父类有多个相同名字的方法,则通过mro方法顺序解析(广度优先算法,层次结构进行调用)

    2 )  通过类的方法_str_()方法,返回一个对象的描述print,我们可以进行重写,这样在返回对象的时候,就是返回这个重写的内容

super()获取父类定义
在子类中,如果要获取父类的方法时,我们可以通过super()来调用,代表父类的定义,而不是父类的对象。

多态:
1.多态是方法的多态,属性没有多态
2.必要条件:继承、方法重写

特殊方法
obj._dict_:对象的属性字典
obj._class_:对象所属的类
class._bases_:类的基类元组(多继承)
class.base_:类的基类
class_mor()_ :类层次结构
class._subclasses_()子类的列表

除了继承,我们也可以用组合实现一个类的方法和属性的复用

有23种模式OFO23,越复杂,越需要模式,这里说两个最常用的两个模式:
工厂模式:
造对象,实现创造者和实现者的分离,统一在工厂中进行集中创建,如果要哪个对象,在调用哪个,理解如下:

单例模式:
单例模式的核心作用是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点。减少对系统资源的开销,当一个对象的产生需要比较多的资源,如读取配置文件、产生其他依赖对象时(工厂模式),可以生成一个"单例对象",然后永久的驻留在内存中,从而极大降低开销。

 如上:只产生一个Car()工厂对象就可以了,无需很多工厂。重新定义new和init就可以了。

原文地址:https://www.cnblogs.com/dangjingwei/p/12238347.html