Hi, I am teaching an Python object-oriented programming class based on my own materials. I am using Pygame to explain many OOP concepts. So far its going very well.
I have built many small games as examples, but I keep running into a design dilemma. I will often have a class, where I have an instance variable (I know it should be called an attribute!), and I want to be able to give it a starting value, but I also want to be able to reset it to the same value if the game is played more than once. As a trivial example, here is the start of a Game class, that keeps track of the score of the game: class Game: def __init__(self): self.score = 0 def reset(self): self.score = 0 My main code instantiates a Game object and the game plays. If the user wants to start the game over, I call the reset method. There are two different problems with this approach: 1) I am duplicating code. This gets nasty when I have lots of instance variables to reset. 2) Any time I want to change the "starting" value, I must make the identical change in both methods. The obvious solution is to have the __init__ method call the reset method: class Game: def __init__(self): self.reset() def reset(self): self.score = 0 That does work fine and I like it. But it breaks a general rule that you should declare all instance variables in the __init__ method. I use PyCharm for the development of these games, and the "linter" (over the right side scroll bar) always flags this as a warning that a variable like this is not defined in my __init__ method. I'm looking for a general solution that solves this. The best I've come up with so far is to do something like this for each instance variable: class Game: def __init__(self): self.score = None # create the variable here, but only assign it a value in the reset method below self.reset() def reset(self): self.score = 0 # Supply the actual start value here. Anyone have any other suggestions for how to do this cleanly? Thanks, Irv