尝试在新的 class 中使用来自另一个 class 的方法时,我不断收到位置参数错误
I keep getting positional argument errors when trying to use a method from another class in a new class
我在Python中定义了一个球class,如下所示,它初始化为质量= 1,半径= 1,然后我们可以将其位置和速度向量设置为2d numpy 数组。
class Ball():
def __init__(self, pos = np.array([0,0]), vel = np.array([0,0]), mass = 1, radius = 1):
self.mass = mass
self.radius = radius
self.pos = pos
self.vel = vel
我还有一个Ball的女儿class,叫Container,本质上就是一个半径为10的大球,如下:
class Container(Ball):
def __init__(self, radius = 10):
self.radius = radius
球 class 也有三种我想在新的 class 中使用的方法,称为模拟。这些方法定义在ball class中,如下(参数other只是self ball碰撞的另一个球):
def move(self, dt):
self.dt = dt
return np.add((self.pos),(np.dot((self.vel),self.dt)))
def time_to_collision(self, other):
self.other = other
self.posdif = np.subtract(self.pos, other.pos)
self.veldif = np.subtract(self.vel, other.vel)
self.posdif = np.subtract(self.pos, other.pos)
self.veldif = np.subtract (self.vel, other.vel)
self.raddif = self.radius - other.radius
return (-2*np.dot(self.posdif, self.veldif) + np.sqrt(4*(np.dot(self.posdif, self.veldif)**2)-4*np.dot(self.veldif, self.veldif)*(np.dot(self.posdif, self.posdif)-np.dot(self.raddif, self.raddif))))/(2*np.dot(self.veldif, self.veldif))
def collide(self, other):
self.other = other
return self.vel - (np.dot(self.veldif, self.posdif)*self.posdif)/(np.dot(self.posdif,self.posdif))
对于冗长的计算表示歉意,但我认为计算线不一定与问题相关,只是为了完整性而将其包括在内。这些方法 move
、time_to_collision
和 collide
将在另一个 class 模拟中使用。模拟class定义如下:
class Simulation():
def __init__(self, ball = Ball(), container = Container()):
self._container = container
self._ball = ball
def next_collision(self):
return self._ball.move(self._ball.time_to_collision(self._ball, self._container))
模拟class 旨在用一个 Ball 对象和一个 Container 对象进行初始化。然后它有一个方法 next_collision
(唯一的参数是 self),它使用方法 time_to_collision
来计算球与容器碰撞之间的时间,然后它将使用 move
将系统及时移动到那个时刻,然后使用collide
进行碰撞。如果可视化可能有所帮助,情况看起来像这样:
我试图在我的 next_collision(self):
方法中实现这一点,但我总是遇到相同类型的错误:
TypeError: time_to_collision() takes 2 positional arguments but 3 were given
您的 next_collision
方法只接受两个参数,而您传递了三个参数,就像错误所说的那样。
当您在对象上调用该方法时,会自动传递 self
参数。所以你应该使用它作为 self._ball.time_to_collision(self._container)
来实现你想要的。
我在Python中定义了一个球class,如下所示,它初始化为质量= 1,半径= 1,然后我们可以将其位置和速度向量设置为2d numpy 数组。
class Ball():
def __init__(self, pos = np.array([0,0]), vel = np.array([0,0]), mass = 1, radius = 1):
self.mass = mass
self.radius = radius
self.pos = pos
self.vel = vel
我还有一个Ball的女儿class,叫Container,本质上就是一个半径为10的大球,如下:
class Container(Ball):
def __init__(self, radius = 10):
self.radius = radius
球 class 也有三种我想在新的 class 中使用的方法,称为模拟。这些方法定义在ball class中,如下(参数other只是self ball碰撞的另一个球):
def move(self, dt):
self.dt = dt
return np.add((self.pos),(np.dot((self.vel),self.dt)))
def time_to_collision(self, other):
self.other = other
self.posdif = np.subtract(self.pos, other.pos)
self.veldif = np.subtract(self.vel, other.vel)
self.posdif = np.subtract(self.pos, other.pos)
self.veldif = np.subtract (self.vel, other.vel)
self.raddif = self.radius - other.radius
return (-2*np.dot(self.posdif, self.veldif) + np.sqrt(4*(np.dot(self.posdif, self.veldif)**2)-4*np.dot(self.veldif, self.veldif)*(np.dot(self.posdif, self.posdif)-np.dot(self.raddif, self.raddif))))/(2*np.dot(self.veldif, self.veldif))
def collide(self, other):
self.other = other
return self.vel - (np.dot(self.veldif, self.posdif)*self.posdif)/(np.dot(self.posdif,self.posdif))
对于冗长的计算表示歉意,但我认为计算线不一定与问题相关,只是为了完整性而将其包括在内。这些方法 move
、time_to_collision
和 collide
将在另一个 class 模拟中使用。模拟class定义如下:
class Simulation():
def __init__(self, ball = Ball(), container = Container()):
self._container = container
self._ball = ball
def next_collision(self):
return self._ball.move(self._ball.time_to_collision(self._ball, self._container))
模拟class 旨在用一个 Ball 对象和一个 Container 对象进行初始化。然后它有一个方法 next_collision
(唯一的参数是 self),它使用方法 time_to_collision
来计算球与容器碰撞之间的时间,然后它将使用 move
将系统及时移动到那个时刻,然后使用collide
进行碰撞。如果可视化可能有所帮助,情况看起来像这样:
我试图在我的 next_collision(self):
方法中实现这一点,但我总是遇到相同类型的错误:
TypeError: time_to_collision() takes 2 positional arguments but 3 were given
您的 next_collision
方法只接受两个参数,而您传递了三个参数,就像错误所说的那样。
当您在对象上调用该方法时,会自动传递 self
参数。所以你应该使用它作为 self._ball.time_to_collision(self._container)
来实现你想要的。