类变量
- 不可变变量作为类变量:对于INT,STRING这种不可变变量,如果将其作为类变量,则是传值。即所有对象的类变量有各自的内存地址。
- 可变变量作为类变量:对于列表、字典、自定义类这些可变变量,如果将其作为类变量,则是传引用。即所有对象的类变量公用一个内存地址。
实例变量
- 不管是可变变量还是不可变变量,只要是放在构造函数中,则都是传值。即各个对象拥有自己的对象属性。
示例代码及说明
class Demo(object):
a = 1
list_var = []
def __init__(self, name, age):
self.name = name
self.age = age
def show_variable(self):
print("I'm %s, I'm %s years old" % (self.name, self.age))
def add(self):
print(self.a)
self.a += 1
print(self.a )
def add_list(self):
self.list_var.append(1)
print(self.list_var)
demo1 = Demo('jack', 18)
demo2 = Demo('tom', 22)
# 类的对象也可以访问类变量 a = 1
print(demo1.a)
# 当类对象demo1试图修改类的immutable类变量a时,python的处理是 在内存中为对象demo1新建一个实例变量a,此时对象demo1就具有了自己的实例变量a
demo1.a = 10
# 此时输出的就是对象demo1自己的实例变量a, a = 10
print(demo1.a)
# 类变量实际上没有被修改, 所以输出 a = 1
print(Demo.a)
# 由于类对象demo2没有实例变量a,所以输出的还是类变量 a = 1
print(demo2.a)
# 当类的对象demo1试图修改mutable的类变量list_var时,python的处理是 找到类Demo中的变量list_var, 直接进行修改,不会给类对象demo1新生成一个变量。
# 类 Demo 和 Demo的所有对象公用这个list_var
demo1.list_var.append(1)
print(demo1.list_var) # [1]
print(Demo.list_var) # [1]
print(demo2.list_var) # [1]