Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When is it best to use a class in Python?

I'm new to python and programming in general, so would really appreciate any clarification on this point.

For example, in the following code:

    #Using a class
class Monster(object): 
    def __init__(self, level, damage, duration): 
        print self
        self.level = level
        self.damage = damage
        self.duration = duration

    def fight(self):
        print self 
        print "The monster's level is ", self.level
        print "The monster's damage is ", self.damage
        print "The attack duration is ", self.duration

    def sleep(self): 
        print "The monster is tired and decides to rest."

x = Monster(1, 2, 3)
y = Monster(2, 3, 4)
x.fight()
y.fight()
    y.sleep() 

   #just using a function
def fight_func(level, damage, duration):
    print "The monster's level is ", level
    print "The monster's damage is ", damage
    print "The attack duration is ", duration

fight_func(1, 2, 3)
fight_func(5,3,4)

The pure function version seems cleaner and gives the same result.

Is the primary value of classes that you can create and call a number of methods on an object, e.g. fight or sleep?

like image 643
user1186742 Avatar asked May 16 '12 21:05

user1186742


3 Answers

Your example is rather simplified.

In a more complete example fighting wouldn't just display the current state - it would also modify that state. Your monster might get hurt and that would change its hit points and morale. This state has to be stored somewhere. If you use a class it would be natural to add instance variables to store this state.

Using only functions it would be more difficult to find a good place to store the state.

like image 133
Mark Byers Avatar answered Nov 17 '22 22:11

Mark Byers


Your example isn't particularly interesting — it just prints three numbers. You don't need classes, or even a function (really) to do that.

But if you ever need to write a program that has to keep track of two separate monsters at one time, know their health, differentiate their fighting abilities, and so, you can see the value of encapsulating each of the monsters in a separate monster instance.

like image 34
Larry Lustig Avatar answered Nov 17 '22 20:11

Larry Lustig


what about my monsters? he can fight another monster! Presumably your functional monster cannot do that ;-)

class Monster(object): 
    def __init__(self, level, damage, duration): 
        self.level    = level
        self.damage   = damage
        self.duration = duration
    def fight(self, enemy):
        if not isinstance(enemy, Monster) :
            print "The enemy is not a monster, so I can't fight it."
            return None
        else :
            print "Starting fighting"
        print "My monster's level is ", self.level
        print "My monster's damage is ", self.damage
        print "My monster's attack duration is ", self.duration
        print "The enemy's level is ", enemy.level
        print "The enemy's damage is ", enemy.damage
        print "The enemy's attack duration is ", enemy.duration

        result_of_fight = 3.*(self.level    - enemy.level)  + \
                          2.*(self.damage   - enemy.damage) + \
                          1.*(self.duration - enemy.duration)
        if result_of_fight > 0 :
            print "My monster wins the brutal battle"
        elif result_of_fight < 0 :
            print "My monster is defeated by the enemy"
        else :
            print "The two monsters both retreat for a draw"
        return result_of_fight
    def sleep(self, days): 
        print "The monster is tired and decides to rest for %3d days" % days
        self.level    += 3.0 * days
        self.damage   += 2.0 * days
        self.duration += 2.0 * days
x = Monster(1, 2, 3)
y = Monster(2, 3, 4)
x.fight(y)
x.sleep(10) 

so:

Starting fighting
My monster's level is  1
My monster's damage is  2
My monster's attack duration is  3
The enemy's level is  2
The enemy's damage is  3
The enemy's attack duration is  4
My monster is defeated by the enemy
The monster is tired and decides to rest for  10 days
like image 2
nye17 Avatar answered Nov 17 '22 20:11

nye17