簡體   English   中英

創建對對象屬性的引用列表

[英]Creating a list of references to object attributes

代碼中的問題是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)

您可能要為此使用一個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] ,則同步性將被破壞。

根據使用情況,可以使用兩種方法中的任何一種。 兩者都有局限性,但我認為沒有更多的事情可以做。

沒有辦法在python中做到這一點。 您可以做的是使numerical_vector一個對象,該對象在訪問時返回相應vector項的float值。 例如

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

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

並設置self.numerical_vector = VectorWrapper(self.vector)

如果您必須在引用self.numerical_vector[i]時返回float表示形式,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM