From 653632956c7d6537d4709be1a601e55ac6620c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luiz=20Ot=C3=A1vio?= Date: Sat, 26 Nov 2022 09:11:44 -0300 Subject: [PATCH] Context Manager com classes - Criando e Usando gerenciadores de contexto --- aula149.py | 41 +++++++++++++++++++++++++++++++++++++++++ aula149.txt | 3 +++ 2 files changed, 44 insertions(+) create mode 100644 aula149.py create mode 100644 aula149.txt 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