我已经定义了一个拥有属性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]
上。创建self.cell
而不是简单地使用var.score[r][c]
的目的是为了清晰起见,并避免在以下类定义中拖动r
和c
。
我已经看过使用包装器可变对象的解决方案,例如列表并不令我满意。那么实现它的最佳解决方案是什么?
答案 0 :(得分:3)
您可以使用属性:
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'
答案 1 :(得分:1)
@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
如果你想让整个班级保持一致,那么声明类变量同样准确。