python在向方法传递列表时使用延迟赋值

2024-04-27 02:58:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python类a和它的子类B。我使类B的一个对象传递一些列表类型的参数,这些参数被附加在B中,结果存储在类a中。我希望能够更改其中一个初始参数,并查看反映的更改,而无需进一步ado。让我举例说明:

class A():
    def __init__(self,data):
        self.a=data

class B(A):
    def __init__(self,x,y):
        self.x=x
        self.y=y
        A.__init__(self,self.x+self.y)

    def change_x(self,x):
        self.x = x

现在,我跑了

test = B([1, 2], [3,4])
print(test.a)

我显然得到了[1,2,3,4]。如果我将列表的一部分更改如下:

test.change_x([3,4])
print(test.a)

我想要得到[3,4,3,4],而不是得到[1,2,3,4]。当然,test.a只在实例化过程中计算。你知道吗

我理解为什么不是这样,我读了一些关于生成器的文章,但没有弄清楚如何实现它。我不想以只能迭代一次的iterable结束。你知道吗

有人能帮我吗?一个干净的解决方法?你知道吗


Tags: 对象实例testself类型列表data参数
3条回答

有没有理由拥有类A?您可以创建一个属性或方法a,它在类B中返回您想要的内容。你知道吗

class B():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def change_x(self, x):
        self.x = x

    @property
    def a(self):
        return self.x + self.y


test = B([1, 2], [3, 4])
print(test.a)  # [1, 2, 3, 4]

test.change_x([3, 4])
print(test.a)  # [3, 4, 3, 4]

小注:在这个实现中,change_x方法应该是不必要的。直接访问属性(例如test.x = x)通常比使用getter和setter更具python风格。你知道吗

我最终直接存储self.a(在a中)的所有部分,方法是从self.a的继承类中进行切片/索引。我按照Israel Unterman的建议添加了一个方法“B.update_crc(self)”,以重新评估self.a的某些部分,以防修改。你知道吗

谢谢,我的第一个方法不是正确的:)

您需要“手动”实现它。例如,像这样:

class B(A):
    def __init__(self,x,y):
        self.x=x
        self.y=y
        self.spread_changes()

    def change_x(self,x):
        self.x = x
        self.spread_changes()

    def spread_changes(self):
        A.__init__(self,self.x+self.y)

相关问题 更多 >