Обновление другой переменной класса при обновлении переменной класса - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать класс матрицы, который хранит исходный ввод, а затем создает еще 2 переменные из исходного ввода, называемые строками и столбцами, что означает, что я могу получить доступ к определенным строкам или столбцам, выполнив что-то вроде матрицы ([[1, 2], [3, 4]]). Строки [0], чтобы получить [1, 2] или матрицу ([[1, 2], [3, 4]]). Столбцы [0], чтобы получить [1, 3].Пока это работает довольно хорошо, однако, если бы я хотел переназначить строку или столбец на другое значение, например:

A = matrix([[1, 2], [3, 4]])
print(A.columns[0])

, что дает мне:

[1, 2]

но если бы я выполнил этот блок кода ниже, чтобы обновить столбец, подобный этому,

A.columns[0] = [5, 6]

, а затем снова вывести A, это дало бы мнеисходный ввод,

print(A)

[[1, 2], [3, 4]]

, но печать a.columns [0] дает мне обновленный столбец

[5, 6]

и печать a.columns в целом дает мне

[[5, 6],[2, 4]]

Как бы я закодировал его так, чтобы при выполнении A.columns [0] обновлялась и входная переменная, и переменная столбца?Вот мой оригинальный код:

class matrix:
    def __init__(self, values):
        self.values = values
        self.rows = [row for row in self.values]
        self.columns = [[row[i] for row in self.values] for i in    range(list(set([len(row) for row in self.values]))[0])]

    def __setattr__(self, name, value):
        if name not in ["rows", "columns"]:
            self.__dict__[name] = value
        elif hasattr(self, name):
            #This is the part of code I'm trying to use to attempt updating self.values and self.columns at once, but it isn't even printing so I didn't bother writing any code for it
            print name, value
        else:
            self.__dict__[name] = value

    def __setitem__(self, index, value):
        print index, value

    def __str__(self):
        return str(self.values)

a = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a.columns[1] = [4, 4, 4]
print(a)

по-прежнему дает

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

, когда я хочу, чтобы он дал мне [[1, 4, 3], [4, 4, 6], [7, 4, 9]], но, конечно, обновление переменной columnsне имеют ничего общего с self.values ​​(которая является исходной входной переменной), так как это похоже на наличие 2 совершенно разных переменных.Как связать их вместе, чтобы любые изменения из self.values ​​обновлялись в self.columns и self.rows, а любые изменения из self.columns и self.rows обновляли self.values?

1 Ответ

0 голосов
/ 17 декабря 2018

То, что вы спрашиваете, нелегко.Вы хотите:

  • Определить что-то похожее на атрибут в классе
  • Но вы не хотите, чтобы этот атрибут содержал какое-либо значение.
  • Показать преобразование другого атрибута
  • Уметь получить или установить фрагмент этого преобразования

По пути это создать свойство атрибут , который даст вам то, что вы хотите, вместо копирования значений при создании экземпляра.Этот атрибут свойства может затем переопределить метод для имитации индекса в вашем matrix.Это может выглядеть так:

class Matrix:

    def __init__(self, values):
        self.values = values
        self.rows = self.Row_view(self)
        self.columns = self.Columns_view(self)

    class Columns_view:

        def __init__(self, owner):
            self.owner = owner

        def __str__(self):
            return str(list(list(x) for x in zip(*self.owner.values)))

        def __getitem__(self, key):
            return [row[key] for row in self.owner.values]

        def __setitem__(self, key, new_values):
            for (row, new_row_value) in zip(self.owner.values, new_values):
                row[key] = new_row_value

    class Row_view:

        def __init__(self, owner):
            self.owner = owner

        def __str__(self):
            return str(self.owner.values)

        def __getitem__(self, key):
            return self.owner.values[key]

        def __setitem__(self, key, new_values):
            self.owner.values[key] = new_values

    def __str__(self):
        return str(self.values)

A = Matrix([[1, 2], [3, 4]])
print(A.columns[0])

A.columns[0] = [5, 6]
print(A)

print(A.columns[0])
print(A.columns)

a = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a.columns[1] = [4, 4, 4]
print(a)

print(a.columns[:2])

Могут быть и другие способы сделать это, но, возможно, это более простой способ, если у вас нет дополнительных требований.

...