代码之家  ›  专栏  ›  技术社区  ›  Mathieu Rollet arnaud.breton

如何使两个类共享同一属性?

  •  0
  • Mathieu Rollet arnaud.breton  · 技术社区  · 10 年前

    我定义了一个具有属性的类 score 其是矩阵。 让我们这么说吧 var 是此类的实例。

    我还有一个类需要访问矩阵的一个特定单元格 var.score 。我想这样做:

    class MyClass:
        def __init__(self, r, c):
            self.cell = var.score[r][c]
        ...
        # Then make operations on self.cell
    

    但如果 self.cell 修改后,修改还应反映 var.score[r][c] 。创建 自身单元格 而不是简单地使用 变量内核[r][c] 是为了清晰和避免拖拉 r c 沿着类的以下定义。

    我见过使用包装器可变对象(如列表)的解决方案,但我并不满意。那么,实现这一点的最佳解决方案是什么?

    2 回复  |  直到 10 年前
        1
  •  3
  •   BrenBarn    10 年前

    您可以使用属性:

    class Foo(object):
        def __init__(self, r, c):
            self.r = r
            self.c = c
    
        @property
        def cell(self):
            return var[self.r][self.c]
    
        @cell.setter
        def cell(self, val):
            var[self.r][self.c] = val
    

    然后:

    >>> var = [[1, 2], [3, 4]]
    >>> x = Foo(0, 1)
    >>> x.cell
    2
    >>> x.cell = 8
    >>> var
    [[1, 8], [3, 4]]
    >>> y = Foo(1, 1)
    >>> y.cell = 88
    >>> var
    [[1, 8], [3, 88]]
    >>> var[0][1] = "Hello"
    >>> x.cell
    'Hello'
    
        2
  •  1
  •   hspandher    10 年前

    @BrenBarn解决方案是正确的。只是一个建议,您不应该像那样使用全局变量var。 var 应该在初始化中传递给类。

    class Foo(object):
        def __init__(self, r, c, var):
            self.r = r
            self.c = c
            self.var = var
    
        @property
            def cell(self):
            return self.var[self.r][self.c]
    
        @cell.setter
        def cell(self, val):
            self.var[self.r][self.c] = val
    

    如果希望对整个类保持相同,那么声明类变量同样准确。