Python 如何使两个类共享同一属性?
我定义了一个类,它拥有一个属性Python 如何使两个类共享同一属性?,python,Python,我定义了一个类,它拥有一个属性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]上
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
我见过使用包装器可变对象(如列表)的解决方案,但我并不满意。那么,实现这一点的最佳解决方案是什么 您可以使用一个属性:
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
然后:
您可以使用以下属性:
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<代码>变量应在初始化过程中传递给类
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
如果您想使整个类保持不变,那么声明类变量将同样准确。@BrenBarn solution是正确的。只是一个建议,你不应该像那样使用全局变量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
如果您想让整个类保持不变,那么声明类变量也同样准确。Gah,请告诉我:p.Gah,请告诉我:p。标题是IMHO误导。在你的问题中,你只讲了一门课。你的头衔的答案可能是继承……不,我说的是两个不同的类。第一段:“我定义了一个类…”,第二段:“我有另一个类…”对不起,我忽略了这一点。现在它确实更有意义了。当我读到它时,我只是想象了一些完全不同的东西(这是我的问题)。标题是IMHO误导。在你的问题中,你只讲了一门课。你的头衔的答案可能是继承……不,我说的是两个不同的类。第一段:“我定义了一个类…”,第二段:“我有另一个类…”对不起,我忽略了这一点。现在它确实更有意义了。当我读到它时,我只是想象了一些完全不同的东西(这是我的问题)。哦,请不要告诉我你不喜欢全局变量,因为你害怕它们。伙计,这是Python,不是C!我希望你不要愚蠢地忘记你是如何命名的。在这种特殊情况下,我不明白他为什么不应该使用全局变量。事实上,在这里甚至可能需要使用它。恕我直言,如果您使用的是Python、ruby甚至Java,CS的概念都是一样的。全局变量是可以的,只要你不改变它们。如果认为仅仅因为你在使用python,你就可以自由地做任何事情,那将是愚蠢的。我总是可以自由地做任何我想做的事情,不管语言和/或机器如何。没有人能把我放在一个盒子里说:“你必须使用调试器”或“全局变量不好,不要使用它们,因为你会产生错误”或“不要继承这个或那个”也没有任何其他愚蠢的事情,因为有大量的程序员不知道他们的底线和起点在哪里。因为像你这样的“程序员”,python在编程界没有得到应有的尊重。Python为您提供了很多功能,但强大的功能带来了巨大的责任。思想开放和固执是不同的。静态语言中有很多东西在动态语言中是没有意义的,对全局变量变异的憎恨不在其中。此外,没有“必须”,您可以使用全局变量,但不建议对它们进行变异。记住,python给了你们做任何事情的自由,但前提是你们不是白痴。我每天都这么看。聪明的人问如何做简单的事情,因为他们被放进盒子里,失去了创造力,只是因为这些迷信被用来帮助那些不知道自己在做什么的人。这些聪明的人通常会得到答案,他们会不问而实施。你只局限于自己,硬件或语言的真正局限性正在消失,而且,是的,如果你是个好人,一些惯例。这些“做这个”,“不做这个”甚至不是给孩子们的。哦,请不要告诉我你不喜欢全局变量,因为你害怕它们。伙计,这是Python,不是C!我希望你不要愚蠢地忘记你是如何命名的。在这种特殊情况下,我不明白他为什么不应该使用全局变量。事实上,在这里甚至可能需要使用它。恕我直言,如果您使用的是Python、ruby甚至Java,CS的概念都是一样的。全局变量是可以的,只要你不改变它们。如果认为仅仅因为你在使用python,你就可以自由地做任何事情,那将是愚蠢的。我总是可以自由地做任何我想做的事情,不管语言和/或机器如何。没有人能把我放在一个盒子里说:“你必须使用调试器”或“全局变量不好,不要使用它们,因为你会产生错误”或“不要继承这个或那个”也没有任何其他愚蠢的事情,因为有大量的程序员不知道他们的底线和起点在哪里。因为像你这样的“程序员”,python在编程界没有得到应有的尊重。Python为您提供了很多功能,但强大的功能带来了巨大的责任。思想开放和固执是不同的。静态语言中有很多东西在动态语言中是没有意义的,对全局变量变异的憎恨不在其中。此外,没有“必须”,您可以使用全局变量,但不建议对它们进行变异。记住python给了你做任何事情的自由,但是