diff --git a/aula149.py b/aula149.py new file mode 100644 index 0000000..91cea6e --- /dev/null +++ b/aula149.py @@ -0,0 +1,41 @@ +# Context Manager com classes - Criando e Usando gerenciadores de contexto +# Você pode implementar seus próprios protocolos +# apenas implementando os dunder methods que o +# Python vai usar. +# Isso é chamado de Duck typing. Um conceito +# relacionado com tipagem dinâmica onde o Python não +# está interessado no tipo, mas se alguns métodos existem +# no seu objeto para que ele funcione de forma adequada. +# Duck Typing: +# Quando vejo um pássaro que caminha como um pato, nada como +# um pato e grasna como um pato, eu chamo aquele pássaro de pato. +# Para criar um context manager, os métodos __enter__ e __exit__ +# devem ser implementados. +# O método __exit__ receberá a classe de exceção, a exceção e o +# traceback. Se ele retornar True, exceção no with será +# suprimidas. +# +# Ex: +# with open('aula149.txt', 'w') as arquivo: +# ... +class MyOpen: + def __init__(self, caminho_arquivo, modo): + self.caminho_arquivo = caminho_arquivo + self.modo = modo + self._arquivo = None + + def __enter__(self): + print('ABRINDO ARQUIVO') + self._arquivo = open(self.caminho_arquivo, self.modo, encoding='utf8') + return self._arquivo + + def __exit__(self, class_exception, exception_, traceback_): + print('FECHANDO ARQUIVO') + self._arquivo.close() + + +with MyOpen('aula149.txt', 'w') as arquivo: + arquivo.write('Linha 1\n') + arquivo.write('Linha 2\n') + arquivo.write('Linha 3\n') + print('WITH', arquivo) diff --git a/aula149.txt b/aula149.txt new file mode 100644 index 0000000..ae73278 --- /dev/null +++ b/aula149.txt @@ -0,0 +1,3 @@ +Linha 1 +Linha 2 +Linha 3