How object oriented is my Crazy Eights game?
I'm just going to look at your OOP design for this review, as you requested.

Your canPlayOn() method does not belong in the Card class.  The purpose of your Card class should be to represent a card, and nothing more.  You should be able to use the same Card class for Blackjack, Bridge, or any other card game.  Logic specific to Crazy Eights does not belong there, and should probably be moved into the Player class.

I was initially thinking that your Hand should consist of a set of cards rather than an array, since the items are distinct and order doesn't matter.  Then I saw that your Pile derives from Hand, and in Pile, order does matter.  Maybe using an array is OK after all, if you accept that a Pile is a subclass of Hand.  I think that such an inheritance relationship is more of a hack than an accurate model, but I can let it slide because it seems to work in this case.

In DrawPile.deal(), I would rename the others parameter to recipient_hands.  Also imports should go at the beginning of the file.

I take issue with Player(Hand) and Computer(Hand).  First of all, I would say that a player has a hand rather than a player is a hand.  That suggest that composition should be favoured over inheritance.  Also, the computer is a kind of player, so there should be an inheritance relationship there.  Furthermore, there is a lot of redundant code between Player and Computer, differing mainly in what the output looks like.  Perhaps your Player and Computer classes could be merged into a Crazy8Player class, with the constructor taking name, narrator, and strategy arguments.