如何复制一个类变量 - Python

4

我正在制作一个使用4x4棋盘的游戏,我想检查卡片是否已经被按下。

为此,我使用了两个棋盘。一个用于计算(要复制的变量),另一个用于在游戏中显示(称为状态的原始棋盘)。

我有以下一段代码,我希望将TreasureHuntGrid的状态变量复制并在同一类的另一个函数中使用。它应该独立于被复制的变量,因此状态变量的更改不会影响计算变量。

我认为这里的代码处理状态和计算变量是相同的。

如何使它们独立处理?

class TreasureHuntGrid(GridLayout):
    Finish.shuffle()
    status = ListProperty(Finish.board) #Return a random lists of lists with 1 and -1 
    calculations = status 
    def __init__(self, *args, **kwargs):
      super(TreasureHuntGrid, self).__init__(*args, **kwargs)

    def button_pressed(self, button):
        if self.calculations[row][column] != 2: #Check if it is pressed or not
            button.text = {-1: Finish.surrounded(row, column), 1: 'X'}[self.sta$
            button.background_color = colours[self.status[row][column]]
            self.calculations[row][column] = 2

如果您不希望该类的所有成员共享某个变量的值,那么您就不应将其定义为类变量。请改用实例变量。 - Daniel Roseman
2个回答

3

Python中的所有内容都是命名空间。当您在类定义中定义status = ...时,类对象将获得一个新属性:TreasureHuntGrid.status。您想将statuscalculations属性放入对象命名空间中。要做到这一点,只需在__init__()中定义self.statusself.calculations:

def __init__(self, *args, **kwargs):
  super(TreasureHuntGrid, self).__init__(*args, **kwargs)
  status = ListProperty(Finish.board) #Return a random lists of lists with 1 and -1 
  calculations = status 

此外,请注意Finish.shuffle()只会在模块被导入时调用一次。如果这不是您想要的,请将该行代码放入构造函数中。
您可能对Python确定self.status的含义方式感到困惑。如果您正在读取该字段,则self.status将重定向到父命名空间,如果它未在对象的命名空间中定义:TreasureHuntGrid.status。如果您正在分配给self.status并且它不存在,则会创建它。为了理解我的意思,您可以研究以下示例:
>>> class A:
...    a = 1
...
>>> print A.a
1
>>> obj = A()
>>> print obj.a
1
>>> obj.a = 2
>>> print A.a
1
>>> print obj.a
2

如果您使用的是Python 3,请在print的参数周围加上括号。

我如何访问对象命名空间中的属性?我应该使用什么来代替self.status? - Juanvulcano
您可以通过 self.status 访问它。您可能感到困惑的原因是当对象中没有属性 status,但类中有一个时,self.status 的作用。我已经在我的编辑中尝试解决这个问题。 - Mad Physicist

3
也许你可以尝试使用deepcopy,像这样:
from copy import deepcopy

然后更改:

calculations = status

致:

calculation = deepcopy(status)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接