Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

@property, @par.setter

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 exceeded

Já dei uma pesquisada e disse que é porque ele entra em looping, mas por quê?

1 resposta
solução!

Bom quando você cria uma variavel você está atribuindo aquele nome a um espaço na memoria que vai fazer algo, se eu crio a = "a" então vai ter um espaço na memora com um "a" onde sempre que eu chamo a vai retornar "a".

Até ai tudo certo, agora vamos pro seu caso.

class Personagem():

    def __init__(self, vida_base):
        self.vida = vida_base
    @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

>>>from example import Personagem
>>> novo = Personagem(100)

Agora o python vai rodar seu codigo, ok, vida vai criar 100 na memoria, não pera, agora vida que chamava o 100, vai retornar vida, que era o que chamava o 100 mas vida agora chama vida, entao vida chama vida, vida chama vida, vida chama vida.... e assim vai até o python parar o código sozinho pra sua maquina não travar.

Quando você faz vida chamar _vida ou __vida você ta chamando outra coisa que chama o objeto na memória. Então:

vida -> _vida, _vida -> 100

Que é completamente diferente de:

vida -> 100, vida -> vida #vida deixa de chamar 100 ja que agora chama vida#, vida -> vida, vida -> vida ...