Action dispatch for a combat class
The first thing that came to mind was further encapsulation of the fight mechanics. One thing I did have to change was how success was handled; now it's a member of each action subclass and is given a new value each time Controller.fight is called. 

The other part necessary to this approach was the implementation of a action mode (offensive or defensive) so that actions like Dodge would know what to do.

import random

OFFENSIVE = 0
DEFENSIVE = 1


class Action(object):

    def __init__(self):
        super(Action, self).__init__()
        self.health = 100
        self.success = 0
        self.nextSuccess()

    def nextSuccess(self):
        self.success = random.randint(-2, 3)

    def performOn(self, subject, success):
        pass


class Dodge(Action):

    def __init__(self):
        super(Dodge, self).__init__()

    def performOn(self, subject):
        if mode == DEFENSIVE and subject.success &gt; self.success:
            subject.performOn(subject, success=subject.success)


class Attack(Action):

    def __init__(self):
        super(Attack, self).__init__()

    def performOn(self, subject, mode):
        if self.success &lt; 0 and subject.success &lt; 0:
            return
        if mode == OFFENSIVE and self.success &gt;= subject.success:
            subject.health -= 5 if success &gt; 1 else 3
        elif mode == DEFENSIVE and self.success &gt; subject.success:
            subject.health -= 3


class Manoeuvre(Action):

    def __init__(self):
        super(Attack, self).__init__()


class Controller:

    def fight(offense, defense):
        offensive = offense.nextSuccess()
        defensive = defense.nextSuccess()
        offense.performOn(defense, OFFENSIVE)
        defense.performOn(offense, DEFENSIVE)


As far as I can tell this does what the original script did. If there are any tweaks that need to be made, let me know!