At Wednesday 8/11/2006 22:35, Ben Finney wrote:

    class Character(object):
        stat_keys = ['strength', 'dexterity', 'intelligence']
        def __init__(self, name, stats):
            self.name = name
            self.health = 10
            self.stats = {}
            for (key, value) in [(k, stats.get(k)) for k in stat_keys]:
                setattr(self, key, value)

Doesn't work, should say self.stat_keys. I prefer this other way:

=== cut ===
class Character(object):
    stat_keys = ['strength', 'dexterity', 'intelligence']
    strength = dexterity = intelligence = 0
    def __init__(self, name, **stats):
        self.name = name
        self.health = 10
        for key, value in stats.iteritems():
            if key in self.stat_keys: setattr(self, key, value)
            else: raise KeyError, "Unknown stats name: %s" % key

class Cleric(Character):
    stat_keys = Character.stat_keys + ['holyness']
    holyness = 0

c=Cleric('Fray Tuck', strength=8, dexterity=5, holyness=2)
print vars(c)
=== cut ===

This way, misspelled properties are caught, and calling interfase is simple too. Also, class attributes provide default instance attributes - you don't have to provide an explicit value. Stats names are extensible as shown.


--
Gabriel Genellina
Softlab SRL
__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis! ¡Abrí tu cuenta ya! - http://correo.yahoo.com.ar
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to