Лучший способ ссылаться на переменные класса изнутри класса?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Лучший способ ссылаться на переменные класса изнутри класса?

Сообщение Anonymous »

Я пытаюсь понять, как ссылаться на переменные класса из экземпляра. Для справки: я использую Python 3.10.12 на компьютере с Linux.

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»