Aprendendo Objetos

Galera comecei a aprender objetos em python hoje e me deparei com um problema quando estava testando, no programa abaixo quando uso a função personagem.atacar(boss.vida) na primeira vez me devolve o valor correto, mas nas vezes subsequentes o boss.vida não atualiza para o valor menos o dano do ataque, sempre me retorna 1050.

iniciei pelo python console dessa forma:

from personagem import Boss, Personagem
personagem = Personagem('MMysTT', 1000, 150)
boss = Boss('Bersil', 1200, 100)
personagem.atacar(boss.vida)

e o código é esse:

class Personagem:

def __init__(self, nome, vida, dano):
    self.nome = nome
    self.vida = vida
    self.dano = dano

def atacar(self, alvo):
    alvo -= self.dano
    return alvo

def morrer(self):
    if self.vida <= 0:
        print(f'O herói {self.nome} morreu!')

class Boss:

def __init__(self, nome, vida, dano):
    self.vida = vida
    self.dano = dano
    self.nome = nome

def atacar(self, alvo):
    alvo -= self.dano
    return alvo

def morrer(self):
    if self.vida <= 0:
        print(f'O chefe {self.nome} morreu!')

Na linha em que o personagem ataca,

personagem.atacar(boss.vida)

Você esta passando a vida do Boss, sempre a mesma (1200), e no código abaixo, sempre vai acontecer a mesma coisa, alvo => 1200 e dano => 150, sempre vai retornar 1050.

def atacar(self, alvo):
    alvo -= self.dano
    return alvo

Você pode passar o objeto Boss como parâmetro e reduzir a vida dele dentro do método atacar

    def atacar(self, alvo):
        alvo.vida = alvo.vida - self.dano
        return alvo.vida

E chamar o método da seguinte maneira

personagem.atacar(boss)

MAS

Eu criaria um método para perder vida, para que outro objeto não mexa diretamente no Boss, assim, caso queira implementar alguma regra de super efetivo/armadura/resistência, você mexe só nesse método, e não em todos os lugares em que mexe na vida do Boss.
Ex.: Na classe Boss

def receberAtaque(self, ataque_recebido):
    self.vida -= ataque_recebido
    return self.vida

Assim ficaria algo como

boss.receberAtaque(personagem.dano)

Ou
Se você quiser usar o método atacar, na Classe Personagem

def atacar(self, alvo):
    return alvo.receberAtaque(self.dano)

E chamar personagem.atacar(boss)