首页 > 解决方案 > Python 类属性更新未传播到父类

问题描述

当我更新实例属性时,该更改不会反映在__str__父类的方法中。这是有道理的,就像在通话super().__init__期间__init__调用的那样,当我对属性进行更新时,它不会再次被调用。

class BulkData:
    def __init__(self, fields):
        self.fields = fields

    def __str__(self):
        return ''.join(str(f) for f in self.fields)

class Node(BulkData):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
        fields = [self.x, self.y, self.z]
        super().__init__(fields)

例子:

n1 = Node(1,2,3)
n1.x = 5
print(n1)
> '123'

我希望结果是'523'.

标签: python

解决方案


您在问题中提到“财产”,但这些只是属性。实现这一目标的一种方法是实际使用 a property

class BulkData:
    def __init__(self, fields):
        self.fields = fields

    def __str__(self):
        return ''.join(self.fields)

class Node(BulkData):
        def __init__(self, x, y, z):
            self._x = x
            self._y = y
            self._z = z
            fields = [self._x, self._y, self._z]
            super().__init__(fields)

        @property
        def x(self):
            return self._x

        @x.setter
        def x(self, val):
            self._x = val
            self.fields[0] = val

现在:

>>> n1 = Node('1','2','3')
>>> n1.x = '5'
>>> print(n1)
523

推荐阅读