代码示例
class User:
name = "张飞"
age = 0
nick_name = "二狗子"
def __init__(self,name,age):
self.name=name
self.age=age
self.get_nick_name()
def get_nick_name():
if self.age<18:
self.nick_name="小鲜肉"
elif self.age in range(18,30):
self.nick_name="男神"
else:
self.nick_name="老腊肉"
return nick_name
============================================================
user1 = User('李四',17)
user2 = User('李五',27)
print(user1.name+","+str(user1.age)+","+user1.nick_name)
print(user2.name+","+str(user2.age)+","+user2.nick_name)
print(User.name+","+str(User.age)+","+User.nick_name)
============================================================
执行结果
李四,17,小鲜肉
李五,27,男神
张飞,0,二狗子
调用内存展示图

- 1 先将变量user1开辟一个内存空间,存放user类对象实例user1的内存空间(如图1)
- 2 User类,也开辟一个类空间,存放类中定义的成员属性(如图2)
- 3 ("李四",17)初始化方法,方法的执行也要开辟一个内存空间(如图3)
- 3.1 这时图3就是User类对象user1的实例地址,目前地址无数据
- 3.1.1 运行初始化方法init那个,既然是方法执行再次开辟内存空间(如图4)
- 4.1.1该方法有3参数,
self:user1的实例地址
初始化方法传的参数age,name分别给内存空间中的age,name赋值
name="李四"
age=17
执行代码self.name=name,将4图的值,通知内存地址存给图3
age同理
- 3.2 这时地址内存数据为
name="李四"
age=17- 4.1.2该方法有3参数,
self:user1的实例地址
执行get_nick()方法,开辟内存空间(如图五)- 5.1 图五内存空间数据
self:user1的实例地址
将跑完程序得出的nick_name赋值给user1的实例地址。跑完的同时回收图五库存
- 5.1 图五内存空间数据
- 4.1.3该方法有3参数
图五代码内存回收后,也会回收图四的内存
- 4.1.2该方法有3参数,
- 3.3 这时地址内存数据为
name="李四"
age=17
nick_name="小鲜肉"
这时图1的内存空间user1指向图三的内存地址
- 3.1 这时图3就是User类对象user1的实例地址,目前地址无数据
然后再看下面打印语句中的内容
- user1.name
就是从图1的内存中找到user1的内存空间,通过user1内存空间的地址找到内存空间图三里面的name属性。age也是同理。 - User.name 是通过类名直接调用里面的属性,就是从图2,类从类空间直接获取name、age的值。
- 当一个类有多个实例时,类的类空间只会开辟一次,在第一次实例开辟内存之前。当第二个实例开辟内存空间时,类不会再次开辟内存空间存放类中的属性
网友评论