Код: Выделить всё
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__() сначала он ссылается на self.x в выражении RHS self.x + 1. Этот self.x относится к Foo.x. Результат этого выражения присваивается переменной экземпляра в LHS. Эта переменная экземпляра маскирует self.x в RHS, который был разрешен как переменная класса Foo.x. Это происходит для всех f1, f2 и f3. И поскольку все они имеют результат 1, они указывают на один и тот же участок памяти, который занят литералом 1, и именно поэтому f1.x — это f2.x — True, и поэтому f1.x — это f3.x.
Как лучше всего присвоить выражение self.x = self.x + 1 Фу.х? Я чувствую, что злоупотребляю MRO в Python, поэтому всякий раз, когда я хочу сослаться на переменную класса, я просто использую self. Причина, по которой я это делаю, заключается в том, что, хотя я могу гарантировать, что в классе не будет экземпляра и переменной класса с одинаковым именем, я не могу гарантировать, что я не буду перемещать переменную экземпляра в переменную класса или наоборот и проходить через self был способом найти разрешение как переменных экземпляра, так и класса.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -the-class