从类内部引用类变量的最佳方法?

问题描述 投票:0回答:1

我试图了解如何从实例引用类变量。作为参考,我在 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
是解析实例变量和类变量的方法(只要名称在组合命名空间中是唯一的)。

python python-3.x
1个回答
0
投票

从类内部引用类变量的最佳方法?

所以使用类名,而不是

self
。 Python 中一切皆对象,
Foo
self
一样都是对象。

将表达式 self.x = self.x + 1 赋值给 Foo.x 的最佳方法是什么?

Foo.x = Foo.x + 1
© www.soinside.com 2019 - 2024. All rights reserved.