Não entendi até o momento o porquê de ter que usar uma variável privada quando se usa o @property.
E o porquê que dá este erro quando não se usa
@property
    def vida(self):
        return self.vida
    @vida.setter
    def vida(self, nova_vida):
        if nova_vida > 0:
            self.vida = nova_vida
        else:
            self.vida = 0
Traceback (most recent call last):
  File "C:\Users\Adm\OneDrive\Documentos\TestePython\index.py", line 9, in <module>
    vanders.defender(slime)
  File "C:\Users\Adm\OneDrive\Documentos\TestePython\Vanders.py", line 11, in defender
    self.vida -= inimigo.dano - self.armadura / 100
  File "C:\Users\Adm\OneDrive\Documentos\TestePython\Personagem.py", line 27, in vida
    return self.vida
  File "C:\Users\Adm\OneDrive\Documentos\TestePython\Personagem.py", line 27, in vida
    return self.vida
  File "C:\Users\Adm\OneDrive\Documentos\TestePython\Personagem.py", line 27, in vida
    return self.vida
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceededJá dei uma pesquisada e disse que é porque ele entra em looping, mas por quê?