我试图了解如何从实例引用类变量。作为参考,我在 Linux 机器上使用 Python 3.10.12。
class Foo:
x = 0
def __init__(self):
self.x = self.x + 1
if __name__ == '__main__':
f1 = Foo()
print(f1.x)
f2 = Foo()
print(f2.x)
f3 = Foo()
print(f3.x)
print(id(Foo.x))
print(id(f1.x))
print(id(f2.x))
print(id(f3.x))
print(f1.x is f2.x)
print(f1.x is f3.x)
我得到的输出是:
1
1
1
140040546762960
140040546762992
140040546762992
140040546762992
True
True
我的解释如下。
当通过调用
Foo()
创建并初始化 __init__()
时,它首先在 RHS 表达式 self.x
中引用 self.x + 1
。这个 self.x
解析为 Foo.x
。该表达式的结果被分配给 LHS 上的实例变量。此实例变量屏蔽了 RHS 上的 self.x
,该变量被解析为类 Foo.x
变量。所有 f1
、f2
和 f3
都会发生这种情况。因为它们都有结果 1
,所以它们指向由文字 1
占用的同一块内存,这就是为什么 f1.x is f2.x
为 True,f1.x is f3.x
也是如此。
将表达式
self.x = self.x + 1
分配给 Foo.x
的最佳方法是什么?我觉得我一直在滥用 python MRO,所以每当我想引用一个类变量时,我都会通过self
。我这样做的原因是,虽然我可以保证该类不会有同名的实例和类变量,但我不能保证我不会将实例变量移动到类变量,反之亦然,并通过self
是解析实例变量和类变量的方法(只要名称在组合命名空间中是唯一的)。
从类内部引用类变量的最佳方法?
所以使用类名,而不是
self
。 Python 中一切皆对象,Foo
与 self
一样都是对象。
将表达式 self.x = self.x + 1 赋值给 Foo.x 的最佳方法是什么?
Foo.x = Foo.x + 1