假设我有两个班级。简单的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()
在这种情况下,如何才能实现以下行为?
myObj.rounded_side
更改为X
,自动将myObj.square.side
更改为X
。 myObj.square.side
更改为X
,自动将myObj.rounded_side
更改为round(X)
。如果可能的话,以一种不需要对Square
课程进行任何修改的方式(这是我目前面临的问题的简化版本;在原始版本中,我不喜欢&#39} #39; t可以访问Square
的代码。
到目前为止我尝试了什么:
rounded_side
转换为属性。这样就可以获得行为1.但是,我没有看到如何将square
转换为属性,从而可以获得行为2。MyClass
继承Square
,这样两个属性都处于相同的深度,但是我失去了一些理想的班级结构(我宁愿拥有用户访问myObj.square.side
,而不是myObj.side
)如果有人感兴趣,我面临的实际问题是:
我在pygame中编写游戏,我的Player
类具有其位置的属性,该属性是具有两个浮点数(2D位置)的数组。这用于确定玩家的位置,以及决定如何在游戏物理的下一个更新步骤中更新它的位置。
但是,我还想在Player
类中拥有Rect
属性(其中包含有关播放器图像周围的矩形的信息),以便在显示播放器时使用在屏幕上,以及推断碰撞时。 Rect
类使用整数来存储矩形的位置(像素坐标)。
为了能够将玩家的位置信息存储在一个浮点数中,但为了方便我也使用Rect
类,我想到了它们之间的这种依赖关系,其中改变一个也相应地改变另一个
答案 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查找。