Как мне отслеживать, как изменяется значение атрибута экземпляра в нескольких методах? Python3

#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)
 
  1. Похоже, вы действительно хотите изменить атрибуты объекта self.x и self.y , но вы изменяете только некоторые временные локальные переменные x an y .
  2. Вы передаете 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. Большое вам спасибо! Это, наконец, решило проблему, я очень ценю вашу помощь.