Getter/setter但是对于嵌套属性呢?

2024-04-27 10:22:57 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个班。简单的Square类:

class Square:
    def __init__(self, side):
        self.side = side

以及稍微复杂一点的MyClass类:

class MyClass:
    def __init__(self, square=None):
        if square is None:
            self.square = Square()
        else:
            self.square = square

        self.rounded_side = round(self.square.side)

我实例化一个MyClass对象,如下所示:

myObj = MyClass()

在这种情况下,如何才能达到以下行为?你知道吗

  1. myObj.rounded_side更改为X,会自动将myObj.square.side也更改为X。你知道吗
  2. myObj.square.side更改为X,会自动将myObj.rounded_side更改为round(X)。你知道吗

如果可能,以一种不需要对Square类进行任何修改的方式(这是我目前面临的问题的简化版本;在原始版本中,我没有Square的代码访问权限)。你知道吗


到目前为止我尝试的是:

  • 我的第一次尝试是将rounded_side转换为属性。这使得获得行为1成为可能。但是,我没有看到如何将square也转换为属性,以使获得行为2成为可能。你知道吗
  • 我还考虑过让MyClassSquare继承,这样两个属性的深度都相同,但是这样我就失去了类所需的一些结构(我宁愿用户访问myObj.square.side,而不是myObj.side

如果有人感兴趣,我面临的实际问题是:

我正在pygame中编写一个游戏,我的Player类的位置有一个属性,它是一个带有两个float(2D position)的数组。这是用来确定玩家的位置,并决定如何更新它的位置在下一个更新步骤的游戏的物理。你知道吗

但是,我还希望在Player类中有一个^{}属性(它保存关于播放器图像周围矩形的信息),用于在屏幕上显示播放器和推断冲突。Rect类使用整数存储矩形的位置(像素坐标)。你知道吗

为了能够将播放器的位置信息存储在一个float中,而且为了方便起见,还使用了Rect类,我考虑在它们之间建立这种依赖关系,其中改变一个也相应地改变另一个。你知道吗


Tags: self版本none属性initdefmyclass播放器
1条回答
网友
1楼 · 发布于 2024-04-27 10:22:57

如前所述,将rounded_side设为属性,但让它访问self.square中的值以获取和设置。你知道吗

@property
def rounded_side(self):
    return self.square.side

@rounded_side.setter
def rounded_side(self, side):
    self.square.side = side

现在,设置rounded_side将使用setter将值设置为square;直接将值设置为square将意味着属性getter将从那里查找它。你知道吗

相关问题 更多 >