To satisfy PyCharm, which probably observes best practice, I just put all the attributes in __init__ with dummy or default values, and if they need to be reset I can implement a reset(). So what if it duplicates code and work? If it's a performance problem because the object is spammy, you can deal with that.

Also, you can just instantiate a new one to get your defaults. If you need to preserve some of the state there are simple ways to do that also.

On 5/25/2019 11:55 AM, mspaintmaes...@gmail.com wrote:
For just a score variable, it's probably not a big deal to have an = 0 in there twice as duplicate code, but games are complicated and so I'm sure you've got lots of other fields as well, and that's where the duplication becomes problematic, especially if it's just there to appease the linter. I'm assuming the Game object is sort of an application context that survives the entire duration of the program's runtime, and that aside from score, you have a variety of other fields as well that need to be reset. For things like this, I would split game into a 2-tiered object, where each object has the desired lifespan. Something like this...

class ApplicationContext:
  def __init__(self):
    self.session = GameSession()

  def reset(self):
    self.session = GameSession()

class GameSession:
  def __init__(self):
    self.score = 0
    self.player_location = (0, 0)
    self.zombies = self.build_zombie_list()
self.im_just_making_up_examples = etc

Nope, this doesn't solve your fundamental problem of getting rid of a duplicate assignment, but it does group things with identical lifecycles so that the duplication is always limited to just the single 'session' field no matter how complicated your game becomes.


On Sat, May 25, 2019 at 11:37 AM Irv Kalb <i...@furrypants.com <mailto:i...@furrypants.com>> wrote:

    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

Reply via email to