尝试在新的 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))

对于冗长的计算表示歉意,但我认为计算线不一定与问题相关,只是为了完整性而将其包括在内。这些方法 movetime_to_collisioncollide 将在另一个 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) 来实现你想要的。