python - 通过对象 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
为什么对于列表对象,当通过对象修改类变量时,它会针对所有实例进行修改,但对于字符串却没有?
解决方案
这里有一些东西可以更好地理解它:
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)
静态属性对同一类的每个实例都是通用的。因此,通过对象而不是类调用此参数可能是问题所在。
推荐阅读
- tableau-api - 如何在 Tableau 中为轴刻度使用范围而不是单个值?
- mysql - 从 SQL 中输入的日期查找最近的日期,两种方式
- javascript - 如何选择()元素背景颜色?
- c# - 如何将数字从十进制传送到整个字节数组
- bash - 如何重新运行脚本?
- angular - ViewEncapsulation.ShadowDom 与 ViewEncapsulation.Native
- javascript - i 在 JavaScript for 循环中不递增
- python - 如何序列化包含原始 JSON 的模型字段?
- javascript - 单击按钮将数组值加载到变量中
- android - 使用底部导航栏从片段开始活动