为什么我的类变量没有在Python中的所有示例中被改变?

w9apscun  于 2022-11-28  发布在  Python
关注(0)|答案(3)|浏览(174)

我正在学习课程,但不明白这一点:

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

我以为类变量可以被所有示例访问,但是为什么它对所有示例都不改变呢?

ecfsfe2w

ecfsfe2w1#

它不会对所有人都发生变化,因为这样做:one.var = 2,创建一个与类变量同名的新示例变量,但只针对示例one,之后,one将首先找到它的示例变量并返回,而two将只找到类变量并返回。
要更改class变量,我建议两个选项:
1.创建一个类方法来更改类变量(我的首选项)
1.直接使用类更改它

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
c86crjj0

c86crjj02#

无论是否存在同名的类属性,通过示例对属性进行赋值 * 始终 * 都会创建/更新示例变量。要更新类属性,必须使用对该类的引用。

>>> type(one).var = 2
>>> print(one.var, two.var)
2 2

在实践中,type(one)可能会返回 * 错误 * 的类来更新特定的类属性,但在实践中,当只有类的一个示例可用时,也不需要更改类属性。

ctehm74n

ctehm74n3#

one.var = 2实际上通过对象添加新的示例变量var,但不更改类变量var,在添加新的示例变量var后,one.var访问新的示例变量var,如下所示。* 如果存在同名类和示例变量相同名称的示例变量优先,而相同名称的类变量在被对象访问时被忽略:

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

输出量:
因此,要更改类变量var,需要使用类名MyClass,如下所示:

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)

输出量:
基本上,您应该使用类名来访问类变量,因为无论是否存在同名示例变量,您都可以访问类变量。因此,使用类名访问类变量比使用对象访问类变量更安全,如下所示:

class MyClass:
    var = 1

one = MyClass()
two = MyClass()
      # Here       # Here
print(MyClass.var, MyClass.var)
MyClass.var = 2 # Changes the class variable by the class name
      # Here       # Here
print(MyClass.var, MyClass.var)

输出量:

我对How to access "static" class variables in Python?的回答详细解释了有关访问类变量的内容。

相关问题