类变量和实例变量
# 类变量和实例变量
有的人也会把类变量称为类属性,把实例变量称为实例属性。
# 类变量
定义在类中,方法之外的变量,称作类变量。类变量是所有实例公有的变量,每一个实例都可以访问、修改类变量。
# 定义方式
类变量在类中的定义:
class 类名:
类变量1 = 值
类变量2 = 值
def func(self):
...
1
2
3
4
5
6
2
3
4
5
6
# 调用方式
可以通过类名或者实例名加圆点的方式访问类变量,比如:
Student.classroom
Student.address
1
2
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
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
2
3
4
5
不推荐实例变量和类变量同名:
- 类中,实例变量和类变量可以同名
- 但这种情况下使用实例对象将无法调用类变量,它会首选实例变量,无论这个变量是否已定义
- 实例对象绑定新的实例属性时,会直接「覆盖」掉重名的类属性(这里的覆盖指的是会创建一个同名的实例变量)
# 类变量和实例变量区别
- 类变量,所有实例对象共享该变量
- 实例变量,属于某一个实例对象,用于描述具体的对象
# 类里面的三种类型变量
- 在所有方法之外定义的变量,称为类变量
- 在方法内部,通过
self.变量名
方式定义的变量,称为实例变量 - 在方法内部,通过
变量名=变量值
方式定义的变量,称为局部变量
(完)