父项具有与子项不同的变量名称

时间:2012-09-18 16:03:18

标签: python default-arguments

我正在写一个简单的Pong游戏。我希望我的Paddle和我的Ball对象都继承自DynamicObj,这是一个父类,它有一个update方法,使用基本的简单Euler积分来勾选位置。问题是Paddle对象的位置存储在rect中(因此使用rect.x访问x pos),Ball对象的位置存储在x和y值中。有没有办法让它们都能从能够勾选其位置的同一类继承?

这是我到目前为止所拥有的:

class DynamicObj:
    def __init__(self, vel):
        self.vel = vel
    def update(self, delta):
        self.x += self.vel.x * delta
        self.y += self.vel.y * delta

class Ball(DynamicObj):
    def __init__(self, x, y, radius, vel):
        self.x = x
        self.y = y
        self.radius = radius
        self.vel = vel

class Paddle(DynamicObj):
    def __init__(self, rect, vel):
        self.rect = rect
        self.vel = vel
        #what I want is to create self.x and self.y that respectively point to the same place as self.rect.x and self.rect.y

我在考虑用property做这件事。

2 个答案:

答案 0 :(得分:1)

是的,properties会有所帮助:

class Paddle(DynamicObj):
    # ...
    @property
    def x(self):
        return self.rect.x

现在你的划水盘将有一个只读字段x。如果你想要一个setter,请使用@x.setter来装饰它。

但我仍然认为你的想法是错误的。在矩形方面操作通常要容易得多。如果您碰巧使用pygame,它有许多简洁的方法。只需基于矩形类创建每个对象,或者使用统一的方式获取它(即接口)。

为什么在地球上,你会问,如果用圆形球做矩形吗?那是因为粗略碰撞检测对于矩形来说很便宜(再次参见pygame的有效方法)。如果两个矩形没有碰撞,由它们限制的复杂形状的物体当然也不会。只有当边界矩形碰撞时,您才必须进行可能更昂贵的精确碰撞检查。

答案 1 :(得分:0)

你的意思是,这个?

class Paddle(DynamicObj):
def __init__(self, rect, vel):
    self.x = rect.x
    self.y = rect.y
    self.vel = vel

编辑: 好的,所以我将这个“答案”作为澄清......