TypeError: CalculateSalary () missing 1 required positional argument: 'Title'

0

When trying to create a simple code in Python and I came across the following error in the method of calculating salary

  

TypeError: CalculateSalary () missing 1 required positional argument: 'Title'

class Professores():
    ID = 0
    Nome = "João Das Neves Negras"
    Titulo = "dr"
    Formacao = "Cientista da computação"
    DataNascimento = "22/09/1998"
    Email = "[email protected]"
    NumDisciplinas = 10

    def pegarID(self):
        return self.ID

    def pegarNome(self):
        return self.Nome

    def pegarTitulo(self):
        return self.Titulo

    def pegarFormacao(self):
        return self.Formacao

    def pegarDataNascimento(self):
        return self.DataNascimento

    def pegarEmail(self):
        return self.Email

    def pegarNumDisciplinas(self):
        return self.NumDisciplinas

    def DefinirID(self, id):
        self.ID = id

    def DefinirNome(self, nome):
        self.Nome = nome

    def DefinirTitulo(self, Titulo):
        self.Titulo = Titulo

    def DefinirFormacao(self, Formacao):
        self.Formacao = Formacao

    def DefinirDataNascimento(self, DataNascimento):
        self.DataNascimento = DataNascimento

    def DefinirEmail(self, Email):
        self.Email = Email

    def DefinirNumDisciplinas(self, NumDisciplinas):
        self.NumDisciplinas = NumDisciplinas

    def CalcularSalario(self):
        salario = (400 * self.NumDisciplinas)
        if(self.Titulo == "me"):
            return salario + salario*0.3
        if(self.titulo == "dr"):
            return salario + salario*0.5
        else:
            return salario

prof = Professores()

prof.DefinirID(1)
print('ID: {}'.format(prof.pegarID()))
print('Nome: {}'.format(prof.pegarNome()))
print('Titulo: {}'.format(prof.pegarTitulo()))
print('Formação: {}'.format(prof.pegarFormacao()))
print('Data de nascimento: {}'.format(prof.pegarDataNascimento()))
print('Email: {}'.format(prof.pegarEmail()))
print('Número de disciplinas: {}'.format(prof.pegarNumDisciplinas()))
print('Salario: {}'.format(prof.CalcularSalario()))
    
asked by anonymous 10.10.2017 / 00:53

2 answers

1

When executing your code the error that was raised was the following:

  

AttributeError: 'Teachers' object has no attribute 'title'

This is because objects in your class contain neither the 'title' attribute, nor any of the attributes you want. To make objects in your class have the desired attributes you must create them within the __init__ method. Your corrected class would look more like this:

class Professor:
    def __init__(self, id, nome, titulo, formacao, data_nascimento, email, num_disciplinas):
        self.id = id
        self.nome = nome
        self.titulo = titulo
        self.formacao = formacao
        self.data_nascimento = data_nascimento
        self.email = email
        self.num_disciplinas = num_disciplinas

    def calcular_salario(self):
        salario = 400 * self.num_disciplinas

        if self.titulo == 'me':
            return salario + salario * 0.3
        elif self.titulo == 'dr':
            return salario + salario * 0.5
        else:
            return salario


prof = Professor(1, 'João Das Neves Negras', 'dr', 'Cientista da computação', '22/09/1998', '[email protected]', 10)

print('ID: {}'.format(prof.id))
print('Nome: {}'.format(prof.nome))
print('Titulo: {}'.format(prof.titulo))
print('Formação: {}'.format(prof.formacao))
print('Data de nascimento: {}'.format(prof.data_nascimento))
print('Email: {}'.format(prof.email))
print('Número de disciplinas: {}'.format(prof.num_disciplinas))
print('Salario: {}'.format(prof.calcular_salario()))
    
10.10.2017 / 16:43
0

Why did you put these attributes as static? Would not it be more logical to put it in init method? So Type:

class Professores():
    def __init__(self,ID,nome,Titulo,Formacao,DataNasc,email,NumDisc)
        self.ID=ID
        self.Titulo=Titulo
        self.Nome=nome
        self.Formacao=Formacao
        self.DataNascimento=DataNasc
        self.Email=email
        self.NumDisciplinas=NumDisc

    def pegarID(self):
        return self.ID

    def pegarNome(self):
        return self.Nome

    def pegarTitulo(self):
        return self.Titulo

    def pegarFormacao(self):
        return self.Formacao

    def pegarDataNascimento(self):
        return self.DataNascimento

    def pegarEmail(self):
        return self.Email

    def pegarNumDisciplinas(self):
        return self.NumDisciplinas

    def DefinirID(self, id):
        self.ID = id

    def DefinirNome(self, nome):
        self.Nome = nome

And another thing: Are you going to put your attributes as private? So does this get functions? Otherwise, they are unnecessary. From what I know, in python the methods and attributes are public by default

    
10.10.2017 / 01:44