面向对象2-类变量与实例变量
1.类变量的用途:大家共用的属性,节省开销。比如大家的国籍都是China, 像这个属性就可以写成是类变量。
当类变量和实例变量中存在一个相同名字的变量时。程序执行的时候,会先在实例本身的内存中去找,找不到的话,再去类的内存中去找。两个占用的是不同的内存。
程序如下:1)有一个类变量n,在r1,r2中分别调用,发现r1,r2中n的值跟类变量中的相同。
2)当在r1中把n进行重新赋值以后,发现r1中的n发生了变化,但是类变量和r2中的保持原值不变。
说明:重新赋值以后,相当于r1在自己的内存中开辟了一块新的内存给n, 但是r2和类变量中的n 依旧用的是同一块内存。(注意观察下图中内存地址的变化)
class Role(object): #类名 n=123 #类变量 name="我是类name" def __init__(self ,name ,role ,life_value=100 ,money=15000): #构造函数,初始化实例 self.name = name #变量是赋给了实例,叫实例变量。 self.role = role def shot(self): #类的方法 print("shooting...") def got_shot(self): print("ah...,I got shot...") print(Role.n) print("类变量中n的内存地址:%s"%(id(Role.n))) r1=Role("Lily","police") #生成一个角色 print(r1.n,r1.name) print("r1中n的内存地址:%s"%(id(r1.n))) r1.n="123_new" print(r1.n) print("在r1中给n重新赋值以后,n的内存地址:%s"%(id(r1.n))) r2=Role("Jack","terrorist") #生成一个角色 print(r2.n,r2.name) print("r2中n当前的内存地址%s"%(id(r2.n))) print("类变量中n当前的内存地址%s"%(id(Role.n)))
运行结果:
123
类变量中n的内存地址:492245264
123 Lily
r1中n的内存地址:492245264
123_new
在r1中给n重新赋值以后,n的内存地址:12660608
123 Jack
r2中n当前的内存地址492245264
类变量中n当前的内存地址492245264
2.当类变量中有个n_list=[ ]空数组的情况下时,情况发生了变化,在r1,r2中append增加元素到数组后,类变量和r1,r2中的n_list都发生了变化,大家共享一块内存。
class Role(object): #类名 n=123 #类变量 n_list=[] name="我是类name" def __init__(self ,name ,role ,life_value=100 ,money=15000): #构造函数,初始化实例 self.name = name #变量是赋给了实例,叫实例变量。 self.role = role def shot(self): #类的方法 print("shooting...") def got_shot(self): print("ah...,I got shot...") #print(Role.n) print("类变量中n_list的内存地址:%s"%(id(Role.n_list))) r1=Role("Lily","police") #生成一个角色 r1.n_list.append("from R1") print(r1.n_list,r1.name) print("r1中n_list的内存地址:%s"%(id(r1.n_list))) r2=Role("Jack","terrorist") #生成一个角色 print(r2.n,r2.name) r2.n_list.append("from R2") print("r2中n_list当前的内存地址%s"%(id(r2.n_list))) print(r2.n_list) print("类变量中n_list当前的内存地址%s"%(id(Role.n_list))) print(Role.n_list)
运行结果:
3.接着上面的情况,如果在r1中对数组重新赋值以后,则在r1中会为n_list开辟一块新的内存。r2和类中的n_list还是共享一块内存。
class Role(object): #类名 n=123 #类变量 n_list=[] name="我是类name" def __init__(self ,name ,role ,life_value=100 ,money=15000): #构造函数,初始化实例 self.name = name #变量是赋给了实例,叫实例变量。 self.role = role def shot(self): #类的方法 print("shooting...") def got_shot(self): print("ah...,I got shot...") #print(Role.n) print("类变量中n_list的内存地址:%s"%(id(Role.n_list))) r1=Role("Lily","police") #生成一个角色 r1.n_list=["from r1"] print(r1.n_list,r1.name) print("r1中n_list的内存地址:%s"%(id(r1.n_list))) r2=Role("Jack","terrorist") #生成一个角色 print(r2.n,r2.name) r2.n_list.append("from R2") print("r2中n_list当前的内存地址%s"%(id(r2.n_list))) print(r2.n_list) print("类变量中n_list当前的内存地址%s"%(id(Role.n_list))) print(Role.n_list)
运行结果:
4.除了上面介绍的情况外,在实例中还可以对实例变量进行增加,删除,修改等功能。都是常见功能,此处不再赘述。