0%

Python_类变量与实例变量

类变量:可以在类的所有实例间共享的变量

实例变量:实例化后每个实例单独拥有的变量

示例:利用类变量查看以构建的实例个数

1
2
3
4
5
6
7
8
9
10
11
12
13
class Test(object):  
num_of_instance = 0
def __init__(self, name):
self.name = name
Test.num_of_instance += 1

if __name__ == '__main__':
print(Test.num_of_instance) # 0
t1 = Test('jack')
print(Test.num_of_instance) # 1
t2 = Test('lucy')
print(t1.name , t1.num_of_instance) # jack 2
print(t2.name , t2.num_of_instance) # lucy 2

这里还涉及很多变量指向的问题例如以下代码:

不可修改变量时:值传递时

类修改了变量:

1
2
3
4
5
6
7
8
9
class Person:
name="aaa"

p1=Person()
p2=Person()
Person.name="bbb"
print(p1.name) # bbb
print(p2.name) # bbb
print(Person.name) #bbb

实例修改了变量:

1
2
3
4
5
6
7
8
9
class Person:
name="aaa"

p1=Person()
p2=Person()
p1.name="bbb"
print(p1.name) # bbb
print(p2.name) # aaa
print(Person.name) # aaa

值传递的情况下,类变量的变化同步到了实例变量,而实例变量的改变不会影响类

变量可修改时: 引用传递时

类修改了变量

1
2
3
4
5
6
7
8
class Person:
name=[]
p1=Person()
p2=Person()
Person.name.append(1)
print(p1.name) # [1]
print(p2.name) # [1]
print(Person.name) # [1]

实例修改了变量:

1
2
3
4
5
6
7
8
class Person:
name=[]
p1=Person()
p2=Person()
p1.name.append(1)
print(p1.name) # [1]
print(p2.name) # [1]
print(Person.name) # [1]

引用传递的情况下,类变量的变化同步到了实例变量,而实例变量的改变同步到了类

具体的分析需要查看内存分布情况,但是我没找到详细的解释,这里略过;