类相关变量
类变量
类的变量,类所在的模块被加载时,初始化类变量及其所引用的对象。
类变量引用可变类型
1.修改可变类型对象成员
类方式
class Demo(object):
a = [1, 2, 3] # list为可变类型
if __name__ == "__main__":
demo1 = Demo()
Demo.a[1] = 88 # 类方式修改对象成员
demo2 = Demo()
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
print("Demo.a=", Demo.a)
代码输出:
demo1.a= [1, 88, 3]
demo2.a= [1, 88, 3]
Demo.a= [1, 88, 3]
类对象方式
class Demo(object):
a = [1, 2, 3] # list为可变类型
if __name__ == "__main__":
demo1 = Demo()
print(demo1.a)
print("*"*30)
demo2 = Demo()
demo2.a[1] = 88 # 类对象方式修改对象成员
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
print("Demo.a=", Demo.a)
代码输出:
[1, 2, 3]
******************************
demo1.a= [1, 88, 3]
demo2.a= [1, 88, 3]
Demo.a= [1, 88, 3]
无论是通过类方式还是类对象方式,修改类变量a所引用的可变类型(list)对象的成员,都将影响类的所有对象(demo1和demo2)。
原因
类变量a所引用的可变类型(list)对象,在模块加载时就已创建,所有新创建对象(demo和demo2)中类变量a都引用同一个可变类型(list)对象。只要对象类变量a的引用未改变,可变类型(list)对象内容的修改,影响类的所有对象。
2.修改类变量引用
类方式
class Demo(object):
a = [1, 2, 3] # list为可变类型
if __name__ == "__main__":
demo1 = Demo()
print("demo1.a=", demo1.a)
print("Demo.a=", Demo.a)
print("*"*30)
Demo.a = 88 # 类方式修改类变量引用
demo2 = Demo()
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
print("Demo.a=", Demo.a)
代码输出:
demo1.a= [1, 2, 3]
Demo.a= [1, 2, 3]
******************************
demo1.a= 88
demo2.a= 88
Demo.a= 88
类的方式修改类变量的引用,影响了所有类对象,包括已创建过的类对象。
类对象方式
class Demo(object):
a = [1, 2, 3] # list为可变类型
if __name__ == "__main__":
demo1 = Demo()
print("demo1.a=", demo1.a)
print("Demo.a=", Demo.a)
print("*"*30)
demo1.a = 88 # 类对象方式修改类变量引用
demo2 = Demo()
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
print("Demo.a=", Demo.a)
代码输出:
demo1.a= [1, 2, 3]
Demo.a= [1, 2, 3]
******************************
demo1.a= 88
demo2.a= [1, 2, 3]
Demo.a= [1, 2, 3]
类对象方式修改类变量的引用,仅影响当前对象,对其他对象,及类均无影响。
类变量引用不可变类型
类方式
class Demo(object):
a = 3 # 数字3是常量,属于不可变类型对象
if __name__ == "__main__":
demo1 = Demo()
print("demo1.a=", demo1.a)
print("Demo.a=", Demo.a)
print("*"*30)
Demo.a = 88 # 类方式修改类变量引用
demo2 = Demo()
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
print("Demo.a=", Demo.a)
代码输出:
demo1.a= 3
Demo.a= 3
******************************
demo1.a= 88
demo2.a= 88
Demo.a= 88
类的方式修改类变量的引用,影响了所有类对象,包括已创建过的类对象。
类对象方式
class Demo(object):
a = 3 # 数字3是常量,属于不可变类型对象
if __name__ == "__main__":
demo1 = Demo()
print("demo1.a=", demo1.a)
print("Demo.a=", Demo.a)
print("*"*30)
demo1.a = 88 # 类对象方式修改类变量引用
demo2 = Demo()
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
print("Demo.a=", Demo.a)
代码输出:
demo1.a= 3
Demo.a= 3
******************************
demo1.a= 88
demo2.a= 3
Demo.a= 3
类对象方式修改类变量引用,仅影响当前对象,其他对象和类均无影响。
类对象变量
使用self指代的变量,一般在__init__
函数中定义。在类对象被创建时进行初始化。无法使用类的方式访问类对象变量。
类对象变量引用可变类型
class Demo(object):
def __init__(self):
self.a = [1, 2, 3] # list类可变对象
if __name__ == "__main__":
demo1 = Demo()
demo2 = Demo()
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
print("*"*30)
demo1.a[2] = 88 # 修改类对象变量引用对象的成员
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
代码输出:
demo1.a= [1, 2, 3]
demo2.a= [1, 2, 3]
******************************
demo1.a= [1, 2, 88]
demo2.a= [1, 2, 3]
每个类对象变量独自拥有类对象的变量,是在每次类对象被创建时所生成的。因此,各个类对象的修改,互不影响。
类对象变量引用不可变类型
class Demo(object):
def __init__(self):
self.a = 3 # 数字3是常量,属于不可变类型对象
if __name__ == "__main__":
demo1 = Demo()
demo2 = Demo()
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
print("*"*30)
demo1.a = 88 # 修改类对象变量引用对象
print("demo1.a=", demo1.a)
print("demo2.a=", demo2.a)
代码输出:
demo1.a= 3
demo2.a= 3
******************************
demo1.a= 88
demo2.a= 3
类对象变量的修改,各个对象间互不影响。
总结
修改目标 | 类方式 | 类对象方式 | |
---|---|---|---|
类变量 | 可变对象成员 | 类、所有类对象 | 类、所有类对象 |
类变量引用 | 类、所有类对象 | 当前对象 | |
类对象变量 | 可变对象成员 | —— | 当前对象 |
类对象变量引用 | —— | 当前对象 |
建议
- 优先使用类对象的方式修改类变量或者类对象变量;
- 当涉及变量引用的是可变对象时,需谨慎处理。