2
respostas

Self + o próprio objeto dentro de um método de classe

Na parte de apresentação do padrão de projeto "Observer", o professor começa com esse código:

# nota_fiscal.py
from datetime import date

class Item(object):

    # código omitido 

class Nota_fiscal(object):

    def __init__(self, razao_social, cnpj, itens, data_de_emissao=date.today(), detalhes=''):
        self.__razao_social = razao_social
        self.__cnpj = cnpj
        self.__data_de_emissao = data_de_emissao
        if len(detalhes) > 20:
            raise Exception('Detalhe da nota superior à 20 caracteres!')
        self.__detalhes = detalhes
        self.__itens = itens

        # chamando os métodos
        self.__envia_por_email(self)
        self.__salva_no_banco(self)
        self.__imprime(self)

    def __envia_por_email(self, nota_fiscal):
        print 'enviando nota por e-mail...'

    def __salva_no_banco(self, nota_fiscal):
        print 'salvando no banco...'        

    def __imprime(self, nota_fiscal):
        print 'imprimindo ...'        

    # demais métodos omitidos

if __name__ == '__main__':

    itens=[
        Item(
            descricao='ITEM A',
            valor=100
        ),
        Item(
            descricao='ITEM B',
            valor=200
        )
    ]

    nota_fiscal = Nota_fiscal(
        cnpj='012345678901234',
        razao_social='FHSA Limitada',
        itens=itens
    )

Porém, não ficou claro porque os métodos "observers" (ou que virarão "observers") estão escritos para receber (self, nota_fiscal). Não seria suficiente pedir apenas (self) e usar o seu próprio self._notafiscal?

2 respostas

Imagino que é porque o nota_fiscal não esta definido no init da classe. E como essa classe não esta herdando de outra então aquele parametro precisa ser passado pra função.

Não está no init porque é ela mesma. "nota_fiscal" é um objeto do próprio tipo/classe "Nota_fiscal".

Talvez foi só um exemplo não muito bem pensado, porque depois ele mostra outra implementação com as funções separadas como Observers.