Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 父变量名与子变量名不同_Python_Default Arguments - Fatal编程技术网

Python 父变量名与子变量名不同

Python 父变量名与子变量名不同,python,default-arguments,Python,Default Arguments,我正在写一个简单的乒乓球游戏。我希望我的桨和球对象都继承自DynamicObj,DynamicObj是一个父类,它有一个update方法,该方法使用基本的简单Euler积分来确定位置。问题是桨对象的位置存储在一个rect中(因此使用rect.x访问x位置),而球对象的位置存储在一个x和y值中。有没有一种方法可以使它们都继承自同一个类,从而能够标记它们的位置 以下是我目前掌握的情况: class DynamicObj: def __init__(self, vel): se

我正在写一个简单的乒乓球游戏。我希望我的桨和球对象都继承自DynamicObj,DynamicObj是一个父类,它有一个
update
方法,该方法使用基本的简单Euler积分来确定位置。问题是桨对象的位置存储在一个rect中(因此使用rect.x访问x位置),而球对象的位置存储在一个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
我正在考虑是否可以使用
属性
执行此操作

你是说,这个

class Paddle(DynamicObj):
def __init__(self, rect, vel):
    self.x = rect.x
    self.y = rect.y
    self.vel = vel
编辑: 好的,我留下这个“答案”作为澄清…

你是说,这个

class Paddle(DynamicObj):
def __init__(self, rect, vel):
    self.x = rect.x
    self.y = rect.y
    self.vel = vel
编辑: 好的,我留下这个“答案”作为澄清…

是的,会有帮助:

class Paddle(DynamicObj):
    # ...
    @property
    def x(self):
        return self.rect.x
现在,您的拨杆将有一个只读字段
x
。如果你想要一个setter,用
@x.setter
来装饰它

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

你会问,究竟为什么要用一个长方形来表示一个圆球?这是因为使用矩形进行粗略碰撞检测的成本很低(再次参见pygame的高效方法)。如果两个矩形没有碰撞,那么由它们包围的形状复杂的对象也肯定不会碰撞。只有当边界矩形发生碰撞时,您才需要运行可能更昂贵的精确碰撞检查。

是,将有助于:

class Paddle(DynamicObj):
    # ...
    @property
    def x(self):
        return self.rect.x
现在,您的拨杆将有一个只读字段
x
。如果你想要一个setter,用
@x.setter
来装饰它

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


你会问,究竟为什么要用一个长方形来表示一个圆球?这是因为使用矩形进行粗略碰撞检测的成本很低(再次参见pygame的高效方法)。如果两个矩形没有碰撞,那么由它们包围的形状复杂的对象也肯定不会碰撞。只有当边界矩形发生碰撞时,您才需要运行可能更昂贵的精确碰撞检查。

否,因为我仍然需要
rect
对象的其他参数。人们通常讨厌多重继承,但我想说的是,事实就是这样:拨片既是动态对象又是矩形。否,因为我仍然需要
rect
对象的其他参数。人们通常不喜欢多重继承,但我想说的是,事实就是这样:paile既是一个DynamicObject,也是一个rect。谢谢你的建议。是的,我知道一个解决方案是用矩形代表球的位置,但我觉得这会增加不必要的开销。此外,圆的碰撞检测比矩形便宜(不用比较4条边,只需比较两个圆之间的距离即可)。谢谢你的建议。是的,我知道一个解决方案是用矩形代表球的位置,但我觉得这会增加不必要的开销。此外,圆的碰撞检测比矩形便宜(不必比较4条边,只需比较两个圆之间的距离即可)。