Day10/面向对象:实例变量-实力方法,类变量-类方法,初级内存图

1,对象内存图
下图,定义了一个类,调用了一次类来创建了一个对象,调用了一次类中的方法.
首先,是定义类,初始化类,定方法等,这些不会体现出来,所以画在图中右上方表示.
第一行代码,调用类来定义一个对象w01,定义的过程:
Wife()表明这个变量要调用类Wife,随即在内存中开辟了这个类相应的对象空间;
然后程序跳转到类中,先执行类的初始化.在内存开辟了一块空间,建立__init__的临时栈帧,它有四个项,后三个是name, height, weight,分别只想了调用时给的参数;而默认参数self,则是指向w01对象空间的,然后初始化每个项目,给他们赋值,完毕后,栈帧释放.
最后的创建对象的结果就是,w01的name, height, weight指向了对应的参数.
第二行代码,w01.play(),调用了类中的方法play, 也是开辟临时栈帧来做这件事.self.name指向"铁锤",从而打印了一条消息.
Day10/面向对象:实例变量-实力方法,类变量-类方法,初级内存图
2,创建两个对象,的内存图
这里的要点是,栈帧是临时存放,使用完毕后就释放了;下一次调用类时,再新创建;同样,类中的方法也是如此,调用时临时存在一下
Day10/面向对象:实例变量-实力方法,类变量-类方法,初级内存图
3,对象的赋值和修改
对象的本质也是变量,所以赋值时,内存的指向跟变量是一样的;
第三行代码修改d01中的名字时,是深层修改,所以d02也是会跟着,一起被修改的
Day10/面向对象:实例变量-实力方法,类变量-类方法,初级内存图
4,用方法修改对象的值
结果是能够修改成功的.
本质跟上一个图是一样的,相当与d01.price = p1.price,然后修改p1.price
最后虽然p1消失了,但是修改还是会保留下来的
Day10/面向对象:实例变量-实力方法,类变量-类方法,初级内存图
5,列表嵌套对象,并修改对象
列表的第三个元素是一个新定义的对象,本质跟前两个一样;
把列表的切片赋值给新列表,是浅拷贝,只是拷贝了一层对应关系,实际指向的目标是同一些;
修改新列表时,因为做的是深层修改,所以改变了这个对象本身,列表1也是会跟着发生变化的
Day10/面向对象:实例变量-实力方法,类变量-类方法,初级内存图
6,类变量
下图,i01和i02分别是定义的两个实例变量;右上方的total_money是定义的一个类方法,特点:
一 随类的加载而加载,它的存在在对象之前
二 被所有对象所共享
三 只有一份
Day10/面向对象:实例变量-实力方法,类变量-类方法,初级内存图
7,一个类中的实例所组成的集合,长这个样子
Day10/面向对象:实例变量-实力方法,类变量-类方法,初级内存图