John Salerno <[EMAIL PROTECTED]> writes: > Let's say I'm making a game and I have this base class: > > class Character(object): > > def __init__(self, name, stats): > self.name = name > self.strength = stats[0] > self.dexterity = stats[1] > self.intelligence = stats[2] > self.luck = stats[3] > > Is this a good way to assign the values to the different attributes? > Should 'stats' be a list/tuple (like this), or should I do *stats > instead?
A tuple is fine, but assumes that there is a logical *sequence* to these values. If that's true, it should be no problem to assign them as: class Character(object): def __init__(self, name, stats): self.name = name (self.strength, self.dexterity, self.intelligence, self.luck) = stats >>> foo = Character("Foo", (10, 11, 9, 10)) >>> print foo.name, foo.strength, foo.intelligence Foo 10 9 In this case, though, I don't see any value in a specific sequence, so a mapping looks better to me and gives the caller more flexibility in how to set it up. class Character(object): stat_keys = ['strength', 'dexterity', 'intelligence', 'luck'] def __init__(self, name, stats): self.name = name self.stats = {} for (stat_key, stat_value) in [(k, stats[k]) for k in self.stat_keys]: setattr(self, stat_key, stat_value) >>> foo = Character("Foo", dict( ... dexterity = 11, luck = 10, ... strength = 10, intelligence = 9, ... )) >>> print foo.name, foo.strength, foo.intelligence Foo 10 9 > I'm trying to think ahead to when I might want to add new > attributes In which case you almost certainly want a mapping, not a sequence. > and I want to make sure this doesn't get crazy with individual > parameters instead of just the one list. This is one of the many reasons why Python's built-in composite types are so useful. A group of semantically-related values can be passed as a single composite value. -- \ "I hope that after I die, people will say of me: 'That guy sure | `\ owed me a lot of money.'" -- Jack Handey | _o__) | Ben Finney -- http://mail.python.org/mailman/listinfo/python-list