Создание списка ссылок на атрибуты объекта - PullRequest
1 голос
/ 21 июня 2019

Проблема в коде заключается в том, что Vector.numeric_vector представляет собой список копий с плавающей точкой, но мне нужно, чтобы он был списком ссылок, поэтому, когда Vector.vector [n] .value изменяется,Vector.numeric_vector [n] также изменен на то же значение.

Заранее спасибо за помощь!

class Var:
    def __init__(self, val):
        self.value = float(val)

    def __float__(self):
        return self.value


class Vector:
    def __init__(self, vector):
        self.vector = vector
        self.numerical_vector = [float(x) for x in vector]

vars = [Var(i) for i in range(5)]
vector = Vector(vars)

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Нет способа сделать это на python. Что вы могли бы сделать, это сделать numerical_vector объектом, который при обращении возвращает значение float соответствующего элемента vector. Например,

class VectorWrapper:
    def __init__(self, vector):
        self.vector = vector

    def __getitem__(self, i):
        return float(self.vector[i])

и установите self.numerical_vector = VectorWrapper(self.vector)

Если вы должны вернуть представление float при ссылке на self.numerical_vector[i],

0 голосов
/ 21 июня 2019

Вы можете использовать для этого property.

class Vector:
    def __init__(self, vector):
        self.vector = vector
    @property
    def numerical_vector(self):
        return [x.value for x in self.vector]

Теперь vector.numerical_vector всегда будет синхронизироваться. Недостатком этого метода является то, что он пересчитывается каждый раз, когда вы получаете к нему доступ, некоторые из них могут не адаптироваться к вашему конкретному приложению.

Если производительность является проблемой, вы можете добавить методы __getitem__ и __setitem__ в Vector следующим образом:

class Vector:
    def __init__(self, vector):
        self.vector = vector
        self.numerical_vector = [float(x) for x in vector]
    def __getitem__(self, i):
        return self.vector[i]
    def __setitem__(self, i, val):
        self.vector[i] = val
        self.numerical_vector[i] = float(val)

В этом случае, если вы установите vector_instance[i], то vector_instance.numerical_vector[i] также будет изменено. Но если вы захотите изменить vector_instance.vector[i] напрямую, синхронность будет нарушена.

В зависимости от варианта использования вы можете использовать любой из двух подходов. Оба имеют ограничения, но я не думаю, что можно сделать гораздо больше.

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