#python #python-3.x #oop
#python #python-3.x #ооп
Вопрос:
Я новичок в Python и изучаю объектно-ориентированное программирование. Однако у меня есть один вопрос, на который я нигде не могу найти ответа
Предположим, что у меня есть пример ниже:
class Node:
def __init__(self):
self.x1 = 10
self.y1 = 100
def thing1(self, x, y):
x = 5
y = 10
print(x, y)
def thing2(self, x, y):
x = 10
print(x)
node = Node()
def main():
node.thing1(node.x1, node.y1)
node.thing2(node.x1, node.y1)
main()
Результат, который я получаю при запуске этого кода, следующий:
15 110
20
Но результат, который я хотел получить, был:
15 110
25
По какой-то причине python не отслеживает, как изменяется значение переменной экземпляра в нескольких методах
Я знаю, что могу просто изменить значение атрибута экземпляра непосредственно в методе, и это сработает, но мне любопытно решение этой проблемы в примере, который я привел выше.
Я был бы очень признателен, если бы вы могли помочь мне с этой проблемой, потому что она озадачивает меня уже довольно давно.
Комментарии:
1. Вы не меняете никаких переменных экземпляра в этих методах.
x
иy
являются просто локальными переменными.2. Являются
x
иy
всегда будутself.x1
иself.y1
(, то есть переменные экземпляра), или вы хотите, чтобы изменения отслеживались для любой переменной?3. То есть вы хотите передать
x
иy
по ссылке. Это зависит от того, чтоx
иy
есть. В вашем случае, если вы хотите простоself.x1
иself.y1
то, что указал @zvone, является решением. если вы хотитеx
иy
хотите быть кем угодно, вам придется прибегнуть к другим способам.
Ответ №1:
С этой функцией есть две проблемы:
def thing1(self, x, y):
x = 5
y = 10
print(x, y)
- Похоже, вы действительно хотите изменить атрибуты объекта
self.x
иself.y
, но вы изменяете только некоторые временные локальные переменныеx
any
. - Вы передаете
x
y
значения и , хотя они не нужны.
У вас те же проблемы и с другой функцией.
Это будет исправленный код:
class Node:
def __init__(self):
self.x = 10
self.y = 100
def thing1(self):
self.x = 5
self.y = 10
print(self.x, self.y)
def thing2(self):
self.x = 10
print(self.x)
def main():
node = Node()
node.thing1()
node.thing2()
if __name__ == "__main__":
main()
Комментарии:
1. Да, я понимаю, что могу сделать это таким образом.
2. Однако я хочу посмотреть, могу ли я передать x1 и y1 в качестве аргументов методу. Поэтому вместо прямой ссылки на x1 я хочу ссылаться на него через локальную переменную с именем x, которая станет x1 при вызове этого метода в функции с именем main . Когда я изменяю значение x в методе с именем thing1 , я хочу, чтобы значение x1 было измененным значением x , но я не хочу ссылаться на него напрямую. Затем в методе с именем thing2 я хочу, чтобы измененное значение x1 было значением x в методе.
3. @TrashDev Когда вы передаете
self.x1
, как вы это делали, вы просто передаете его значение, т. Е.10
. Вы не можете изменитьself.x1
этот способ. Вы не можете передать ссылку на целое число куда-нибудь, чтобы изменить целое число, потому что целые числа являются неизменяемыми объектами в Python.4. Большое вам спасибо! Это, наконец, решило проблему, я очень ценю вашу помощь.