Переназначение зависимых переменных экземпляра - PullRequest
0 голосов
/ 22 октября 2019

Я создал класс Point в python, который функционирует как LinkedList, то есть каждый экземпляр класса Point указывает на следующий объект в цепочке. Эти точки также хранят значение расстояния, расстояние между self.next и self. Я переставляю порядок этой цепочки, обновляя переменную экземпляра .next каждого члена моего списка очков. Однако это не обновляет расчет расстояния. Мне действительно нужно каждый раз переназначать переменную экземпляра .distance или есть лучший или более элегантный способ?

Хороший, простой пример того, что я имею в виду, ниже. Первое печатное заявление - 0,5, второе - 5,5. Я хочу обновить значение b без фактического переназначения их обоих каждый раз.

class Tester():
    def __init__(self,a):
        self.a = a
        self.b = a+5

Hank = Tester(0)
print(Hank.a,Hank.b)
Hank.a=5
print(Hank.a,Hank.b)

Я бы хотел иметь возможность изменить значение a AND b, чтобы второе выражение print было 5,10. Я знаю, что могу переназначить b, но, похоже, должен быть лучший способ.

1 Ответ

0 голосов
/ 22 октября 2019

Для указателей и связанных списков, кажется, ваш ответ здесь: https://www.codefellows.org/blog/implementing-a-singly-linked-list-in-python/

В общем:

Как только вы передаете значение, которое будет присвоено a , оба a и b инициализируются. Так как ваш класс не выполняет итерации по значениям, значение b не будет обновляться просто потому, что значение a было переназначено. Вы должны повторно вызвать класс, чтобы сделать это.

Если вы назначаете вручную, как в своем посте, вы можете сделать это:

class Tester():
    def __init__(self,a):
        self.a = a
        self.b = a+5

Hank = Tester(0)
print(Hank.a,Hank.b)
Hank = Tester(5)
print(Hank.a,Hank.b)

Возврат:

0 5
5 10

Или более элегантно (конечно, нужно обновить в зависимости от диапазона / значения / того, что вы ищете):

class Tester():
    def __init__(self,a):
        self.a = a
        self.b = a+5

i = 0
while i <= 100:
    Hank = Tester(i)
    print(Hank.a, Hank.b)
    i+=5

Возврат:

0 5
5 10
10 15
15 20
20 25
25 30
30 35
35 40
40 45
45 50
50 55
55 60
60 65
65 70
70 75
75 80
80 85
85 90
90 95
95 100
100 105

Наконец,Вы не печатаете запятые, как предполагает ваш пост. Вам нужно добавить их в строку. Одним из примеров является обновление оператора печати с использованием f-строки:

print(f"{Hank.a}, {Hank.b}")

Результат:

0, 5
5, 10
10, 15
15, 20
20, 25
25, 30
30, 35
35, 40
40, 45
45, 50
50, 55
55, 60
60, 65
65, 70
70, 75
75, 80
80, 85
85, 90
90, 95
95, 100
100, 105
...