Python 类变量及实例变量

982 阅读1分钟

类变量

  1. 不可变变量作为类变量:对于INT,STRING这种不可变变量,如果将其作为类变量,则是传值。即所有对象的类变量有各自的内存地址。
  2. 可变变量作为类变量:对于列表、字典、自定义类这些可变变量,如果将其作为类变量,则是传引用。即所有对象的类变量公用一个内存地址。

实例变量

  1. 不管是可变变量还是不可变变量,只要是放在构造函数中,则都是传值。即各个对象拥有自己的对象属性。

示例代码及说明

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]