The [Pygame `Rect`](http://www.pygame.org/docs/ref/rect.html) already comes with a few collision detection functions that may just do what you need:

 - `pygame.Rect.contains`: test if one rectangle is inside another
 - `pygame.Rect.collidepoint`: test if a point is inside a rectangle
 - `pygame.Rect.colliderect`: test if two rectangles overlap
 - `pygame.Rect.collidelist`: test if one rectangle in a list intersects
 - `pygame.Rect.collidelistall`: test if all rectangles in a list
   intersect
 - `pygame.Rect.collidedict`: test if one rectangle in a dictionary
   intersects
 - `pygame.Rect.collidedictall`: test if all rectangles in a dictionary
   intersect

Instead of having a `detectCollisions`method that takes `x1`, `y1`, `w1`, `h1`, `x2`, `y2`, `w2` and `h2`, at the sprite initialization you could set its `Rect`, move and blit it using that same `Rect` as argument to blit, and 
then check for collisions with:

    sprite1.rect.colliderect(sprite2.rect)

From a [A Newbie Guide to pygame](https://www.pygame.org/docs/tut/newbieguide.html):

> **Rects are your friends**.
> 
> [...] I have to admit my favorite part of pygame is the lowly Rect class. A
> rect is simply a rectangle – defined only by the position of its top
> left corner, its width, and its height. Many pygame functions take
> rects as arguments, and they also take ‘rectstyles’, a sequence that
> has the same values as a rect. So if I need a rectangle that defines
> the area between 10, 20 and 40, 50, I can do any of the following:
> 
>     rect = pygame.Rect(10, 20, 30, 30)
>     rect = pygame.Rect((10, 20, 30, 30))
>     rect = pygame.Rect((10, 20), (30, 30))
>     rect = (10, 20, 30, 30)
>     rect = ((10, 20, 30, 30))
> 
> If you use any of the first three versions, however, you get access to
> **Rect’s utility functions. These include functions to move, shrink and
> inflate rects, find the union of two rects, and a variety of
> collision-detection functions**.
> 
> For example, suppose I’d like to get a list of all the sprites that
> contain a point (x, y) – maybe the player clicked there, or maybe
> that’s the current location of a bullet. It’s simple if each sprite
> has a .rect member – I just do:
> 
>     sprites_clicked = [sprite for sprite in all_my_sprites_list
>                        if sprite.rect.collidepoint(x, y)]
> 
> Rects have no other relation to surfaces or graphics functions, other
> than the fact that you can use them as arguments. You can also use
> them in places that have nothing to do with graphics, but still need
> to be defined as rectangles. Every project I discover a few new places
> to use rects where I never thought I’d need them.

So unless you have a specific reason not to rely on Pygame `Rect` and its functions, my suggestion would be: don't reinvent the wheel, stick with it.

They might even make use of some internal c code that provides better performance then implementing a pure python approach, although I'm not sure about this specific point.