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

 

posted on 2017-07-28 14:28  momo8238  阅读(158)  评论(0编辑  收藏  举报