我正在学习课程,但不明白这一点:
class MyClass:
var = 1
one = MyClass()
two = MyClass()
print(one.var, two.var) # out: 1 1
one.var = 2
print(one.var, two.var) # out: 2 1
我认为类变量可以被所有实例访问,为什么类变量没有为其所有实例更新?
对于所有这些都不会改变,因为这样做:
one.var = 2
,创建了一个新的实例变量
与类变量同名,但仅适用于实例one
。
之后,one
将首先找到它的实例变量并返回它,而two
只会找到类变量并返回它。
要更改类变量,我建议有两种选择:
创建一个类方法来更改类变量(我的偏好)
直接使用类来改变它
class MyClass:
var = 1
@classmethod
def change_var(cls, var):
cls.var = var
one = MyClass()
two = MyClass()
print(one.var, two.var) # out: 1 1
one.change_var(2) # option 1
print(one.var, two.var) # out: 2 2
MyClass.var = 3 # option 2
print(one.var, two.var) # out: 3 3
通过实例对属性赋值总是创建/更新实例变量,无论是否存在同名的类属性。要更新类属性,您必须使用对该类的引用。
>>> type(one).var = 2
>>> print(one.var, two.var)
2 2
在实践中,
type(one)
可能会返回错误类来更新特定的类属性,但实际上,当您只有一个可用的类实例时,您不需要更改类属性。
事实上,
one.var = 2
设置了一个新的instance变量,称为var
:它不会更改class变量var
。
话虽如此,
one.var
访问新的instance变量,而不是class变量。
如果 class 和 instance 具有相同的变量名,则优先访问 instance 变量,通过 instance 访问变量时会隐藏类变量:
class MyClass:
var = 1
one = MyClass()
two = MyClass()
print(one.var, two.var)
one.var = 2 # Adds the new instance variable by object
# ↓ Accesses the class variable by object
print(one.var, two.var)
# ↑
# Accesses the new instance variable by object
输出:
1 1
2 1
要更改 class 变量
var
,您需要使用 class 本身:
class MyClass:
var = 1
one = MyClass()
two = MyClass()
print(one.var, two.var)
MyClass.var = 2 # Changes the class variable by the class name
print(one.var, two.var)
输出:
1 1
2 2
我对类似主题的回答解释了有关访问类变量的更多信息。