首页 > 解决方案 > 通过对象 Python 更改类变量

问题描述

文档给出了以下示例:

class Dog:
    tricks = []             # mistaken use of a class variable
    def __init__(self, name):
        self.name = name
    def add_trick(self, trick):
        self.tricks.append(trick)

d1 = Dog('Fiddo')
d2 = Dog('Buddy')

d1.add_trick("role over")
d2.add_trick("play dead")

print(d2.tricks)
["role over", "play dead"]

这证明了类变量的错误使用,因为我们显然不希望所有狗都使用相同的技巧列表。

但是当我尝试这个时:

class A:
    static_attr = 'Static'
    def __init__(self):
        self.object_attr = 'Objective'
    
    def change_static(self, val):
        self.static_attr = val
        
a1, a2 = A(), A()
a1.change_static("Something")
print(a2.static_attr)

我得到:

Static

为什么对于列表对象,当通过对象修改类变量时,它会针对所有实例进行修改,但对于字符串却没有?

标签: python

解决方案


这里有一些东西可以更好地理解它:

class A:
    static_attr = 'Static'
    def __init__(self):
        self.object_attr = 'Objective'
    
    @staticmethod
    def change_static(val):
        A.static_attr = val
        
a1, a2 = A(), A()
A.change_static("Something")
print(a2.static_attr)

静态属性对同一类的每个实例都是通用的。因此,通过对象而不是类调用此参数可能是问题所在。


推荐阅读