Stateless objects without __init__()
The following is an example of a degenerate class that doesn't need an __init__()
method. It's a common design pattern for Strategy objects. A Strategy object is plugged into a Master object to implement an algorithm or decision. It may rely on data in the master object; the Strategy object may not have any data of its own. We often design strategy classes to follow the Flyweight design pattern: we avoid internal storage in the Strategy
object. All values are provided to Strategy
as method argument values. The Strategy
object itself can be stateless. It's more a collection of method functions than anything else.
In this case, we're providing the game play decisions for a Player
instance. The following is an example of a (dumb) strategy to pick cards and decline the other bets:
class GameStrategy: def insurance( self, hand ): return False def split( self, hand ): return False def double( self, hand ): return False def hit( self, hand ): return sum(c.hard for c in hand.cards) <= 17
Each method requires the current Hand
as an argument value. The decisions are based on the available information; that is, on the dealer's cards and the player's cards.
We can build a single instance of this strategy for use by various Player
instances as shown in the following code snippet:
dumb = GameStrategy()
We can imagine creating a family of related strategy classes, each one using different rules for the various decisions a player is offered in blackjack.