类变量和实例变量


# 类变量和实例变量

有的人也会把类变量称为类属性,把实例变量称为实例属性。

# 类变量

定义在类中,方法之外的变量,称作类变量。类变量是所有实例公有的变量,每一个实例都可以访问、修改类变量。

# 定义方式

类变量在类中的定义:

class 类名:
    类变量1 = 值
    类变量2 =def func(self): 
        ...
1
2
3
4
5
6

# 调用方式

可以通过类名或者实例名加圆点的方式访问类变量,比如:

Student.classroom
Student.address
1
2

也可以使用实例变量去访问类变量,此时实例会先在自己的实例变量列表里查找是否有这个实例变量,如果没有,那么它就会去类变量列表里找,如果还没有,弹出异常。

不过,为了防止发生一些混淆情况,对于类变量,最好只使用 类名.类变量 的访问方式,不要用实例去访问类变量

Python 动态语言的特点,让我们也可以给实例添加新的实例变量,给类添加新的类变量和方法,或给已有的变量或方法重新赋值。但是会有一个坑

  • 通过 类名.xxx 修改类变量的值,会影响所有的实例化对象。
  • 通过 实例对象.xxx 修改类变量的值,本质上并不是修改类变量的值,而是在定义一个新的实例变量。

# 实例变量

实例变量指的是实例本身拥有的变量。每个实例的变量在内存中都不一样。只能通过实例对象访问,无法通过类名访问。

# 定义方式

一般情况下,会在类中 __init__ 方法声明实例变量并赋初值,但也可以在类中的实例方法里声明实例变量。

class 类名:
    def __init__(self):
        # 在方法内部,通过 self.变量名 的方式定义的变量就是实例变量
        self.实例变量1 = 值
        self.实例变量2 =# 下面定义了一个 func 实例方法
    def func(self):
        self.实例变量3 =
1
2
3
4
5
6
7
8
9
  • 重点:__init__ 会在实例化对象的时候自动调用,因此对象创建成功就有 实例变量1实例变量2 两个实例属性
  • 调用 func() 方法之后才有第三个实例属性 实例变量3

# 调用方式

可以通过实例名加圆点的方式调用实例变量,比如:

s1 = Student('张三', 13) 
s2 = Student('李四', 14) 

print(s1.name)
print(s2.age)
1
2
3
4
5

不推荐实例变量和类变量同名

  • 类中,实例变量和类变量可以同名
  • 但这种情况下使用实例对象将无法调用类变量,它会首选实例变量,无论这个变量是否已定义
  • 实例对象绑定新的实例属性时,会直接「覆盖」掉重名的类属性(这里的覆盖指的是会创建一个同名的实例变量)

# 类变量和实例变量区别

  • 类变量,所有实例对象共享该变量
  • 实例变量,属于某一个实例对象,用于描述具体的对象

# 类里面的三种类型变量

  • 在所有方法之外定义的变量,称为类变量
  • 在方法内部,通过 self.变量名 方式定义的变量,称为实例变量
  • 在方法内部,通过 变量名=变量值 方式定义的变量,称为局部变量

(完)