六、对象和内存分析
面向过程思想:
面向过程通过过程组成编程,遇到事情,第一步,第二步。。。。,不需要协作,适合小规模的程序,比如开车。
面向对象思维
面向对象通过对象组成编程,比如造车,第一步,第二步。。。。,无法确定,需要大规模的协作,有设计者的思维,拆分成一个个个体,造轮胎的厂家、发动机的厂家、车壳、座椅 、挡风玻璃等等。当然,分成这些块以后,就是一个个的过程去实现。
综上:遇到复杂问题,用面向对象思考,找名词,确定各个名词的关系;面向过程思考,找动词,在面向对象设计好了以后,底层还是过程,执行者的思维。面对不同的问题,采取不同的思维。
对象的进化
数据在不断的进化中,出现了对象这个概念;将一类数据放在一起和处理这些数据的方法 ,统称为对象。
类:
内存分析:
类是对象的模型。通过定义的对象调用类,执行了两个方法,一个是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就可以了。