How to overwrite a method

Asked

Viewed 611 times

-1

Hello I want to overwrite a method, here is the code of the sheet class:

from Aluno import *

class Bolsista(Aluno):
    __bolsa = 0.0

    def renovarBolsa(self):
        print(f"Renovando bolsa de {self._nome}")

    def pagarMensalidade(self):
        print(f"{self._nome} é bolsista! Pagamento facilitado")

    def getBolsa(self):
        return self.__bolsa

    def setBolsa(self,bolsa):
        self.__bolsa = bolsa

is the sub class:

from Pessoa import *

class Aluno(Pessoa):
    __matricula = 0
    __curso = 'null'

    def pagarMensalidade(self):
        print(f"Pagando mensalidade do aluno {self._nome}")

    def getMatricula(self):
        return self.__matricula

    def setMatricula(self,matricula):
        self.__matricula = matricula

    def getCurso(self):
        return self.__curso

    def setCurso(self,curso):
        self.__curso = curso

The mother class:

class Pessoa():
    _nome = 'null'
    _idade = 0
    _sexo = 'null'

    def fazerAniversario(self):
        self._idade += 1

    def getNome(self):
        return self._nome

    def setNome(self,nome):
        self._nome = nome

    def getIdade(self):
        return self._idade

    def setIdade(self,idade):
        self._idade = idade

    def getSexo(self):
        return self._sexo

    def setSexo(self,sexo):
        self._sexo = sexo

    def toString(self):
        return f"""Dados[nome="{self._nome}", idade="{self._idade}", sexo="{self._sexo}"]"""

The Code of Principle:

b1 = Bolsista()
b1.setMatricula(1112)
b1.setNome("Jubileu")
b1.setBolsa(12.5)
b1.setSexo("M")
b1.pagarMensalidade()

when executed

Pagando mensalidade do aluno Cláudio
Jubileu é bolsista! Pagamento facilitado

appeared the message that should be overwritten but why that did not happen

Thanks for the chat

  • 2

    Is a Warning compiler? Put more information than is happening.

2 answers

1

You didn’t tell us everything - where is the student "Claudio" created? This code has problems, but it should print only the information about the student "Jubilee" - you must be calling the .pagarMensalidade Claudio also, in another passage.

Another tip - The reason Python doesn’t have private methods and attributes in the language is because it was discovered with OOP code in practice, that these concepts are a little precious, not so necessary in most cases. That’s why the convention of an attribute with "_" is private, and this is just a convention - in this code there’s nothing to justify you having this bunch of getters and setters just to change the attribute directly. No past value check, return value modification, actor validation exceeding change, nothingness. And if there was, the right way to do this in Python is to use @property, not creating a lot of getters and setters.

Now, this is about the attributes with a _ prefixed. Attributes with two __ prefix, activate a mechanism in the language of "Name Mangling" - and will actually cause erratic operation of your program. Disregard any documentation describing the prefix __ as being of "private attributes`: there are no private attributes in Python - in the past, more than 10 years ago, there was a tendency to try to "translate" these concepts into the Python name-mangling engine - but this does not bring any benefit to your program or its logic.

Another thing you should avoid is the import * - This makes neither a person reading your code nor your IDE know where the class and function names you use in your code come from. Always use explicit import - if you’re going to use a lot of stuff from a module, prefer to import the module and type the modulo.XXXXX in the code of what to do from modulo import * .

0


I recommend using @Property annotations for "get", @do_attribute.Setter for "Setter", and str for the "toString". To overwrite the method you should use inheritance (as seen already used) and from the concept of polymorphism perform the desired.

If I did a similar project I would do it this way:

# =============================================================================
# CLASS'S
# =============================================================================

class Pessoa():

    def __init__(self, nome, idade, sexo):

        self._nome = nome
        self._idade = idade
        self._sexo = sexo

        self._check()

    def _check(self):

        if isinstance(self._nome, str) == False:
            message = f"O nome deve possuir retorno {type(str())}"
            raise ValueError(message)

        elif isinstance(self._idade, int) == False:
            message = f"A idade deve possuir retorno {type(int())}"
            raise ValueError(message)

        elif isinstance(self._sexo, str) == False:
            message = f"O sexo deve possuir retorno {type(str())}"
            raise ValueError(message)

        elif self._sexo not in ["M","F"]:
            message = f"O sexo deve ser passado na forma como: (M) masculino ou (F) feminino"
            raise ValueError(message)

    @property
    def nome(self):
        return self._nome

    @nome.setter
    def nome(self, nome):
        self._nome = nome

    @property
    def idade(self):
        return self._idade

    @idade.setter
    def idade(self, idade):
        self._idade = idade

    @property
    def sexo(self):
        return self._sexo

    @sexo.setter
    def sexo(self, sexo):
        self._sexo = sexo

    def fazerAniversario(self):
        self._idade += 1

    def __str__(self):
        CABECALHO = "\n***********************************\n"
        NOME = f"\n\nNOME: {self._nome}"
        IDADE = f"\nIDADE: {self._idade} ano(s)"
        if(self._sexo == "M"):
            SEXO = f"\nSEXO: ({self._sexo}) - masculino"
        else:
            SEXO = f"\nSEXO: ({self._sexo}) - feminino"
        message = CABECALHO + f"DADOS - PESSOA:" + NOME + IDADE + SEXO + CABECALHO
        return message

class Aluno(Pessoa):

    def __init__(self,matricula, curso, **kwargs):
        super().__init__(**kwargs)
        self._matricula = matricula
        self._curso = curso

        self._check_aluno()

    def _check_aluno(self):

        if isinstance(self._matricula, str) == False:
            message = f"A matrícula deve possuir retorno {type(str())}"
            raise ValueError(message)

        elif isinstance(self._curso, str) == False:
            message = f"O curso deve possuir retorno {type(str())}"
            raise ValueError(message)

    @property
    def matricula(self):
        return self._matricula

    @matricula.setter
    def sexo(self, matricula):
        self._matricula = matricula

    @property
    def curso(self):
        return self._curso

    @curso.setter
    def curso(self, curso):
        self._curso = curso

    def pagarMensalidade(self):
        nome = self.nome
        message = f"Pagando mensalidade do aluno: {nome}"
        print(message)

    def __str__(self):
        CABECALHO = "\n***********************************\n"
        NOME = f"\n\nNOME: {self._nome}"
        IDADE = f"\nIDADE: {self._idade} ano(s)"
        if(self._sexo == "M"):
            SEXO = f"\nSEXO: ({self._sexo}) - masculino"
        else:
            SEXO = f"\nSEXO: ({self._sexo}) - feminino"
        CURSO = f"\nCURSO: {self._curso}"
        MATRICULA = f"\nMATRÍCULA: {self._matricula}"
        message = CABECALHO + f"DADOS - ALUNO:" + NOME + IDADE + SEXO + MATRICULA + CURSO + CABECALHO
        return message

class Bolsista(Aluno):

    def __init__(self, bolsa, **kwargs):
        super().__init__(**kwargs)
        self._bolsa = bolsa

    def _check_bolsista(self):

        if isinstance(self._bolsa, float) == False:
            message = f"O valor da bolsa deve possuir retorno {type(float())}"
            raise ValueError(message)

    def renovarBolsa(self):
        print(f"Renovando bolsa de {self._nome}")

    def pagarMensalidade(self):
        print(f"{self._nome} é bolsista! Pagamento facilitado")

    @property
    def bolsa(self):
        return self._bolsa

    @bolsa.setter
    def bolsa(self, bolsa):
        self._bolsa = bolsa

    def __str__(self):
        CABECALHO = "\n***********************************\n"
        NOME = f"\n\nNOME: {self._nome}"
        IDADE = f"\nIDADE: {self._idade} ano(s)"
        if(self._sexo == "M"):
            SEXO = f"\nSEXO: ({self._sexo}) - masculino"
        else:
            SEXO = f"\nSEXO: ({self._sexo}) - feminino"
        CURSO = f"\nCURSO: {self._curso}"
        MATRICULA = f"\nMATRÍCULA: {self._matricula}"
        BOLSA = f"\nVALOR BOLSA: R$ {self._bolsa}"
        message = CABECALHO + f"DADOS - ALUNO:" + NOME + IDADE + SEXO + MATRICULA + CURSO + BOLSA + CABECALHO
        return message

# =============================================================================
# MAIN
# =============================================================================

if __name__ == "__main__":

    bolsista = Bolsista(12.5, matricula="1612130075", curso="CCO", nome="Fulano", idade=21, sexo="M")

    print(bolsista)

    bolsista.pagarMensalidade()

Browser other questions tagged

You are not signed in. Login or sign up in order to post.