Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro quando se chama uma função de um objeto

Tentei seguir o que foi proposto em aula porém algo está dando errado, para mim que o código está exatamente igual porém quando tento chamar uma função do objeto que tem uma função print detro ele dá um erro dizendo float não é "chamavel"

A definição do objeto:

class Conta:

    def __init__(self,numero, titular, saldo, limite):
        print("contruindo objeto .... {}".format(self))
        self.numero = numero
        self.titular = titular
        self.saldo = saldo
        self.extrato = limite

    def extrato(self):
        print("o saldo e {}".format(str(self.saldo)))

    def deposita(self,valor):
        self.saldo += valor

    def saca(self,valor):
        self.saldo -= valor

quando os métodos, saca e deposita são chamados nenhum erro acontece, e é executado com perfeição, porém quando se chama extrato ele dá um erro, vou colocar abaixo a sequência que faço no console

>>> import conta as c

>>> conta = c.Conta(123,"pedro", 1000.0, 1000.0)
contruindo objeto .... <conta.Conta object at 0x000001AC92944788>

>>>conta.extrato()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'float' object is not callable
2 respostas

Eu consegui achar o erro, acabei errando e criando um atributo com o mesmo nome do método, porém não entendi o porquê que não consigo fazer isso, pois para mim são entidades diferentes.

solução!

Após assistir o capitulo 5 do módulo 3 da formação de python descobri algo interessante, apesar do atributo e do método serem entidades diferentes o Python não permite vc criar um método com o mesmo nome do atributo, exceto quando se deseja encapsular os atributos deixando eles "invisíveis", então para se ter um método com o mesmo nome do atributo deve-se criar uma propriedade:

Quando se deseja tornar os atributos privados então deve-se criar métodos para alterar os atributos de forma a não se trabalhar com o atributo diretamente, as propriedades surgem exatamente para isso onde com @property se cria um método para retornar o atributo e @atributo.setter se cria um método para alterar o atributo.

def Class Cliente:
    def __init __(self, nome):
        self.__nome=nome

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

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