创建对对象属性的引用列表

时间:2019-06-21 12:45:47

标签: python oop

代码中的问题是 Vector.numerical_vector 是浮点数副本的列表,但是我需要将其作为引用列表,因此,当Vector.vector [n] .value更改时,Vector.numerical_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 :(得分:0)

您可能要为此使用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将始终同步。这种方法的一个缺点是,每次访问它时都会重新计算它,有些可能不适合您的特定应用程序。

如果性能存在问题,则可以向Vector添加__getitem____setitem__方法,如下所示:

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],则同步性将被破坏。

根据用例,可以使用两种方法之一。两者都有局限性,但我认为没有更多的事情可以做。

答案 1 :(得分:0)

没有办法在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]表示形式,