Of course, because pygame.Surface.get_rect.get_rect() returns a rectangle whichwith the size of the Surface object, but it returns a rectangle that always starts at (0, 0), by default since a Surface object has no position.
The Surface is placed at a position when it is blit to the display.
You've to set the location of the rectangle, either by an assignment to a virtual attribute (see pygame.Rect)keyword argument, e.g:
self.rect = self.image.get_rect() self.rect.topleft = (self.x, self.y))
or by keyword an argumentassignment to a virtual attribute (see pygame.Rect), e.g:
self.rect = self.image.get_rect() self.rect.topleft = (self.x, self.y))