面向对象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.除了上面介绍的情况外,在实例中还可以对实例变量进行增加,删除,修改等功能。都是常见功能,此处不再赘述。
浙公网安备 33010602011771号