Bom dia Wesley!
Identifiquei algumas inconsistências em seu código e algumas sugestões de melhoria!
Primeiro:
A variável/atributo "self.limite" não foi identificada ou iniciada no código, seria um caso de "Dead Code".
No caso do primeiro "if" você tenta examinar o saldo em conta disponível, mas ao invés de utilizar o "abs" como variável de condição, utiliza o limite acarretando em erro ao avaliar o Saldo em conta, seria uma avaliação do Limite disponível, seja do cartão ou cheque especial.
Você não iniciou nenhuma classe para a função, o que acarretaria no mal entendimento do self. nas funções.
O uso do "" antes de um atributo deve ser utilizado na definição da Classe e não do método/função e então alterada a variável para um outro nome em que proteja o real nome da variável de atributo dentro da Classe.
Passarei o código completo da classe Conta e suas funções com as devidas proteções de dados assim como os @propertys e @setters que ficaram ausentes em seu código! Espero ajudar:
import math
class conta:
def __init__(self, nome, extrato, cartaoLimite, cheque, id, totalDisp):
self.titular = nome
self.__saldo = extrato
self.__limite = cartaoLimite
self.__check = cheque
self.__numero = id
self.__total = totalDisp
@property
def nome(self):
return self.titular
@property
def extrato(self):
return self.__saldo
@property
def cartaoLimite(self):
return self.__limite
@property
def cheque(self):
return self.__check
@property
def id(self):
return self.__numero
@property
def totalDisp(self):
return self.__total
@totalDisp.setter
def totalDisp(self):
self.totalDisp = self.extrato + self.cartaoLimite
@cheque.setter
def cheque(self):
if self.totalDisp >= 0:
self.cheque == False
else:
self.cheque == True
Essa é a** classe conta, como pode ver, você deve definir o método de retorno do atributo com uma variável diferente da real variável da Classe** para protegê-la e mantê-la em segredo para apenas quem tem acesso ao código fonte.
O método para isso são os** @propertys**.
Com o poder da Orientação à Objetos nós podemos criar funções que definam as variáveis de totalDisp, ou total disponível, e se a conta esta em cheque especial de maneira mais simples, apenas executando a função dentro do código após como uma triagem para execução da função, seguem exemplos:
def especial(self):
if self.cheque == True:
print('-------------------------ATENÇÃO-----------------------------------')
print('Conta {} se encontra com saldo NEGATIVo e utilizando o CHEQUE ESPECIAL'.format(self.id))
self.especial == True
else:
self.especial == False
def sacavel(self, sacavel):
if self.totalDisp >= self.extrato + self.cartaoLimite and especial == False:
return sacavel == True
else:
return sacavel == False
Seguem exemplos de como ficariam as funções de saque e de checagem de extrato:
def checagemExtrato(self, value):
value = self.extrato + self.cartaoLimite
print('Olá {}, sobre a solicitação de checagem de saldo disponível, seguem informações da conta {}:'.format(self.nome, self.id))
especial(self)
if(value > self.cartaoLimite and value > self.extrato):
print('Você possui um total de saldo de R$ {}, sendo que deste valor, R$ {} é referente ao saldo disponível em conta e R$ {} disponível em limite de cartao.'.format(value, self.extrato, self.cartaoLimite))
else:
print('Você não possui valor suficiente para efetuar o saque. O seu extrato atual é de R$ {}' .format(self.extrato))
def saca(self, valor):
self.totalDisp -= valor
print('Olá {}, seja bem vindo, calculando a possibilidade de saque da conta {}'.format(self.nome, self.id))
sacavel(self)
if sacavel == False:
especial(self)
print('Você não possui saldo suficiente em conta')
checagemExtrato(self)
else:
especial(self)
print("Saque de R$ {} realizado com sucesso na conta de número {}".format(valor, self.id))
checagemExtrato(self)
Espero ter ajudado!