Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使两个类共享同一属性?_Python - Fatal编程技术网

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给了你做任何事情的自由,但是