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

时间:2017-10-23 13:09:39

标签: python properties

假设我有两个班级。简单的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)
  3. 如果可能的话,以一种不需要对Square课程进行任何修改的方式(这是我目前面临的问题的简化版本;在原始版本中,我不喜欢&#39} #39; t可以访问Square的代码。

    到目前为止我尝试了什么:

    • 我的第一次尝试是将rounded_side转换为属性。这样就可以获得行为1.但是,我没有看到如何将square转换为属性,从而可以获得行为2。
    • 我还想过让MyClass继承Square,这样两个属性都处于相同的深度,但是我失去了一些理想的班级结构(我宁愿拥有用户访问myObj.square.side,而不是myObj.side

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

    我在pygame中编写游戏,我的Player类具有其位置的属性,该属性是具有两个浮点数(2D位置)的数组。这用于确定玩家的位置,以及决定如何在游戏物理的下一个更新步骤中更新它的位置。

    但是,我还想在Player类中拥有Rect属性(其中包含有关播放器图像周围的矩形的信息),以便在显示播放器时使用在屏幕上,以及推断碰撞时。 Rect类使用整数来存储矩形的位置(像素坐标)。

    为了能够将玩家的位置信息存储在一个浮点数中,但为了方便我也使用Rect类,我想到了它们之间的这种依赖关系,其中改变一个也相应地改变另一个

1 个答案:

答案 0 :(得分:0)

正如您所说,将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上设置值将意味着它将从那里被属性getter查找。