<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Brain Blog Blog</title>
        <link>https://blog.tchez.dev/pt/</link>
        <description>Brain Blog Blog</description>
        <lastBuildDate>Thu, 12 Jun 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>pt</language>
        <item>
            <title><![CDATA[Como armazenar conhecimento com bancos de dados vetoriais?]]></title>
            <link>https://blog.tchez.dev/pt/vector-database/</link>
            <guid>https://blog.tchez.dev/pt/vector-database/</guid>
            <pubDate>Thu, 12 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Em um mundo inundado de dados não estruturados, como podemos armazenar não apenas informações, mas conhecimento? Este artigo mergulha nos bancos de dados vetoriais - uma abordagem revolucionária que permite busca baseada em similaridade e compreensão semântica. Aprenda como vetores e embeddings reformulam o armazenamento de dados, potencializam aplicações avançadas de IA e marcam uma mudança dos bancos de dados tradicionais para sistemas orientados ao conhecimento.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Este artigo foi originalmente publicado no <a href="https://www.linkedin.com/pulse/banco-de-dados-vetorial-armazenando-conhecimento-martins-porto-netto-gislf" target="_blank" rel="noopener noreferrer">LinkedIn</a>.</p>
</blockquote>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAm0lEQVR4nF1POw6FMAxrKSB+3aBM3bpW3IOdLlylnRBiZOt1jRLE8N5gWYmdxBFSSgghfjAMA+q6BmlFUbz9rutQliX6vsc8z3DOMay1GMcRbdu+ZjIYY3CeJ47jQEoJMUZc18X1NE2oqgrimyDe9x33fSPnjBACmqbhCLSMT3+ZlmXBuq7Ytg3ee85GOfkPMpBZa82slHqFvwcf9EJRyvojwyoAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="360"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/pt/assets/ideal-img/article-og-pt.5ff7715.640.png" srcset="/pt/assets/ideal-img/article-og-pt.5ff7715.640.png 640w,/pt/assets/ideal-img/article-og-pt.77450d8.920.png 920w,/pt/assets/ideal-img/article-og-pt.c6cc2c7.1200.png 1200w" width="640" height="360"></noscript></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="como-armazenar-conhecimento-com-bancos-de-dados-vetoriais">Como armazenar conhecimento com bancos de dados vetoriais?<a href="https://blog.tchez.dev/pt/vector-database/#como-armazenar-conhecimento-com-bancos-de-dados-vetoriais" class="hash-link" aria-label="Link direto para Como armazenar conhecimento com bancos de dados vetoriais?" title="Link direto para Como armazenar conhecimento com bancos de dados vetoriais?" translate="no">​</a></h2>
<p><strong>Em um mundo inundado de dados não estruturados, como podemos armazenar não apenas informações, mas conhecimento?</strong></p>
<p>Este artigo explora o conceito de <strong>bancos de dados vetoriais</strong> — uma tecnologia revolucionária que permite busca baseada em similaridade e compreensão semântica. Vamos entender o que são vetores, como são usados em <a href="https://pt.wikipedia.org/wiki/Processamento_de_linguagem_natural" target="_blank" rel="noopener noreferrer">Processamento de Linguagem Natural (PNL)</a> e como <strong>embeddings</strong> permitem representações eficientes e contextualizadas da informação. Por fim, exploraremos aplicações do mundo real e por que os bancos de dados vetoriais estão se tornando essenciais em sistemas modernos de IA.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="a-ascensão-dos-dados-não-estruturados">A Ascensão dos Dados Não Estruturados<a href="https://blog.tchez.dev/pt/vector-database/#a-ascens%C3%A3o-dos-dados-n%C3%A3o-estruturados" class="hash-link" aria-label="Link direto para A Ascensão dos Dados Não Estruturados" title="Link direto para A Ascensão dos Dados Não Estruturados" translate="no">​</a></h3>
<p>Com o avanço do <a href="https://pt.wikipedia.org/wiki/Big_Data" target="_blank" rel="noopener noreferrer">Big Data</a>, bilhões de dispositivos conectados geram informações em tempo real na forma de texto, imagens, vídeos e mais. Esses formatos não estruturados não se encaixam bem em tabelas SQL tradicionais e exigem soluções de armazenamento mais sofisticadas. É aqui que os <strong>bancos de dados vetoriais</strong> surgem como uma abordagem inovadora, permitindo buscas baseadas em similaridade e armazenamento de conhecimento a partir de dados complexos.</p>
<p>Antes de mergulharmos em como os bancos de dados vetoriais funcionam, vamos primeiro recapitular os fundamentos dos bancos de dados.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="o-que-é-um-banco-de-dados">O que é um Banco de Dados?<a href="https://blog.tchez.dev/pt/vector-database/#o-que-%C3%A9-um-banco-de-dados" class="hash-link" aria-label="Link direto para O que é um Banco de Dados?" title="Link direto para O que é um Banco de Dados?" translate="no">​</a></h2>
<p>Um <strong>banco de dados</strong> é, simplificadamente, uma coleção organizada de informações que pode ser acessada, gerenciada e atualizada de forma eficiente. Ele atua como uma estrutura que armazena e organiza dados, facilitando consultas e manipulações por meio de software especializado.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="bancos-de-dados-relacionais">Bancos de Dados Relacionais<a href="https://blog.tchez.dev/pt/vector-database/#bancos-de-dados-relacionais" class="hash-link" aria-label="Link direto para Bancos de Dados Relacionais" title="Link direto para Bancos de Dados Relacionais" translate="no">​</a></h3>
<p>Os <strong>bancos de dados relacionais</strong> são o tipo mais comumente usado. Eles armazenam dados em tabelas organizadas em linhas e colunas — onde cada linha representa um registro e cada coluna representa um campo ou atributo. Esse modelo é ideal para dados estruturados, como registros de clientes, transações bancárias ou inventários de produtos.</p>
<p>Um exemplo clássico é um banco de dados de clientes com colunas para nome, endereço, número de telefone e e-mail. Os bancos de dados relacionais permitem consultas rápidas e precisas, como “encontrar todos os clientes que fizeram uma compra nos últimos 30 dias”, usando uma linguagem conhecida como <a href="https://pt.wikipedia.org/wiki/SQL" target="_blank" rel="noopener noreferrer">SQL (Structured Query Language)</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="bancos-de-dados-não-relacionais-nosql">Bancos de Dados Não Relacionais (NoSQL)<a href="https://blog.tchez.dev/pt/vector-database/#bancos-de-dados-n%C3%A3o-relacionais-nosql" class="hash-link" aria-label="Link direto para Bancos de Dados Não Relacionais (NoSQL)" title="Link direto para Bancos de Dados Não Relacionais (NoSQL)" translate="no">​</a></h3>
<p>Ao contrário dos bancos de dados relacionais, os <strong>bancos de dados NoSQL</strong> são projetados para lidar com dados não estruturados ou semi-estruturados, oferecendo mais flexibilidade e escalabilidade. Eles armazenam informações em formatos diversos, como documentos JSON, pares chave-valor ou <a href="https://pt.wikipedia.org/wiki/Grafo" target="_blank" rel="noopener noreferrer">grafos</a>. Isso os torna mais adequados para aplicações modernas, como plataformas de mídia social ou serviços de streaming.</p>
<p>Por exemplo, um banco de dados NoSQL orientado a documentos pode armazenar dados em formato JSON, permitindo estruturas de dados mais complexas e aninhadas — sem exigir um esquema rígido.</p>
<p>Entre as categorias de bancos de dados não relacionais, os <strong>bancos de dados vetoriais</strong> se destacam por sua capacidade de armazenar dados contextualizados — também conhecidos como <strong>conhecimento</strong>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="bancos-de-dados-vetoriais">Bancos de Dados Vetoriais<a href="https://blog.tchez.dev/pt/vector-database/#bancos-de-dados-vetoriais" class="hash-link" aria-label="Link direto para Bancos de Dados Vetoriais" title="Link direto para Bancos de Dados Vetoriais" translate="no">​</a></h3>
<p>Os <strong>bancos de dados vetoriais</strong> introduzem uma abordagem transformadora voltada para armazenar e recuperar dados como <strong>vetores</strong> — estruturas matemáticas que representam informações em múltiplas dimensões. Ao contrário dos bancos de dados tradicionais que dependem de correspondência exata, os bancos de dados vetoriais permitem <strong>buscas por similaridade</strong>, que são ideais para recuperar conteúdos como textos, imagens ou sons com base em suas características.</p>
<p>Isso nos leva a uma pergunta chave: <em>o que é um vetor?</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="o-que-é-um-vetor">O que é um Vetor?<a href="https://blog.tchez.dev/pt/vector-database/#o-que-%C3%A9-um-vetor" class="hash-link" aria-label="Link direto para O que é um Vetor?" title="Link direto para O que é um Vetor?" translate="no">​</a></h2>
<p>Um <strong>vetor</strong> é uma estrutura que armazena informações em várias dimensões. No caso de um vetor tridimensional, ele possui três coordenadas — <em>(x, y, z)</em> — que definem sua posição ou direção em um espaço 3D.</p>
<p>Um exemplo do mundo real é como as cores são representadas no modelo <a href="https://pt.wikipedia.org/wiki/RGB" target="_blank" rel="noopener noreferrer"><strong>RGB</strong></a> (Vermelho, Verde, Azul). Uma cor é descrita por três valores, cada um representando a intensidade de vermelho, verde e azul. Por exemplo, o branco é <code>[255, 255, 255]</code>, enquanto o preto é <code>[0, 0, 0]</code>.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAACCAIAAADuA9qHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAASUlEQVR4nAE+AMH/AOKHh+Ojoua4uPLIy8i9qqPMysrU5a6sqKKjo7W1tgDooqLs29rv///1v8W6pIZ3uLe+0Ov89/Ls7+/z9PV3nC7q9xnrRAAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="138"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/pt/assets/ideal-img/image-1-pt.f63257c.640.png" srcset="/pt/assets/ideal-img/image-1-pt.f63257c.640.png 640w,/pt/assets/ideal-img/image-1-pt.8422f76.920.png 920w,/pt/assets/ideal-img/image-1-pt.b09bfad.1166.png 1166w" width="640" height="138"></noscript></div>
<br>
<p>Esse conceito se estende para <strong>vetores 4D</strong>, como <a href="https://pt.wikipedia.org/wiki/RGBA" target="_blank" rel="noopener noreferrer"><strong>RGBA</strong></a>, onde o quarto componente “A” representa o <strong>alpha</strong> (transparência). Um vermelho semi-transparente poderia ser <code>[255, 0, 0, 0.5]</code>.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAACCAIAAADuA9qHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAPklEQVR4nCXJSw4AEAwFQPc/ir0biKWD+DRIdEH1SZjtGKgCOMzN2uR9CmHEqGvhMb/3nNm5Wgr1XolE5PcFtuE4BrnHerAAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="138"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/pt/assets/ideal-img/image-2-pt.77ccc45.640.png" srcset="/pt/assets/ideal-img/image-2-pt.77ccc45.640.png 640w,/pt/assets/ideal-img/image-2-pt.8b9936d.920.png 920w,/pt/assets/ideal-img/image-2-pt.0938b1d.1166.png 1166w" width="640" height="138"></noscript></div>
<br>
<p>Assim como as cores podem ser representadas por vetores em três ou quatro dimensões, os bancos de dados vetoriais usam vetores para organizar itens como palavras, imagens e sons em espaços multidimensionais, onde a <strong>distância</strong> entre vetores indica similaridade.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="representando-palavras-com-vetores">Representando Palavras com Vetores<a href="https://blog.tchez.dev/pt/vector-database/#representando-palavras-com-vetores" class="hash-link" aria-label="Link direto para Representando Palavras com Vetores" title="Link direto para Representando Palavras com Vetores" translate="no">​</a></h3>
<p>Os vetores são amplamente utilizados para representar informações mais abstratas, como palavras. Em PNL, converter palavras em números é essencial para que as máquinas possam entendê-las e manipulá-las. Uma das técnicas mais simples é a <strong>One-Hot Encoding</strong>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="one-hot-encoding">One-Hot Encoding<a href="https://blog.tchez.dev/pt/vector-database/#one-hot-encoding" class="hash-link" aria-label="Link direto para One-Hot Encoding" title="Link direto para One-Hot Encoding" translate="no">​</a></h3>
<p>One-Hot Encoding é uma técnica onde cada palavra é transformada em um vetor de zeros e uns. Nesse vetor, cada posição corresponde a uma palavra específica no vocabulário, e apenas uma posição contém o valor "1" — todas as outras são definidas como "0".</p>
<p>Vamos considerar um conjunto de quatro palavras: cachorro, gato, pássaro e peixe. Usando One-Hot Encoding, essas palavras seriam representadas da seguinte forma:</p>
<ul>
<li><strong>cachorro:</strong> [1, 0, 0, 0]</li>
<li><strong>gato:</strong> [0, 1, 0, 0]</li>
<li><strong>pássaro:</strong> [0, 0, 1, 0]</li>
<li><strong>peixe:</strong> [0, 0, 0, 1]</li>
</ul>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAIAAADzBuo/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAhUlEQVR4nAXBSQ7DIAwAQP7/tUpNK/USKZduSUiJ2c1iwJ0RzFyoSCmNMWMMZvYxHOoYvTOziISXc1KnAg2ISJluv8esluhjJRJ9dBvstm4WTM6ZiMDAfuwJ0+hdtN5KKs/9dZX3Wmqt1TkHCma7QNWiteadB6ff+oOIKSVrbfDhq9dI+AcJco3BC9AoRQAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="299"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/pt/assets/ideal-img/image-3-pt.825af6b.640.png" srcset="/pt/assets/ideal-img/image-3-pt.825af6b.640.png 640w,/pt/assets/ideal-img/image-3-pt.8a9b995.920.png 920w,/pt/assets/ideal-img/image-3-pt.3209930.1166.png 1166w" width="640" height="299"></noscript></div>
<br>
<p>Cada vetor contém apenas um "1", indicando a palavra correspondente, enquanto os "0s" indicam que as outras palavras não estão presentes. Embora essa abordagem seja simples e fácil de implementar, ela apresenta algumas limitações — especialmente à medida que o vocabulário começa a crescer.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="as-limitações-da-one-hot-encoding">As Limitações da One-Hot Encoding<a href="https://blog.tchez.dev/pt/vector-database/#as-limita%C3%A7%C3%B5es-da-one-hot-encoding" class="hash-link" aria-label="Link direto para As Limitações da One-Hot Encoding" title="Link direto para As Limitações da One-Hot Encoding" translate="no">​</a></h3>
<p>Embora simples, a One-Hot Encoding não captura as relações semânticas entre as palavras. No exemplo acima, "cachorro" e "gato" são tratados como completamente diferentes, mesmo que ambos sejam animais de estimação, tenham quatro patas, duas orelhas e uma cauda. Outra desvantagem aparece em cenários com grandes vocabulários — digamos, 10.000 palavras. Nesses casos, cada palavra seria representada por um vetor muito longo com um único "1" entre 10.000 posições, sem oferecer nenhuma indicação de como as palavras se relacionam entre si. Essa ineficiência e falta de informação semântica destacam a necessidade de técnicas mais avançadas para representar palavras como vetores de forma mais eficiente.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="representações-avançadas-embeddings">Representações Avançadas: Embeddings<a href="https://blog.tchez.dev/pt/vector-database/#representa%C3%A7%C3%B5es-avan%C3%A7adas-embeddings" class="hash-link" aria-label="Link direto para Representações Avançadas: Embeddings" title="Link direto para Representações Avançadas: Embeddings" translate="no">​</a></h3>
<p>Para superar essas limitações, foram introduzidos os embeddings — representações vetoriais densas e contínuas de palavras, onde palavras com significados semelhantes são colocadas próximas umas das outras no espaço vetorial. Ao contrário da One-Hot Encoding, os embeddings capturam o significado das palavras, posicionando termos relacionados — como “cachorro” e “gato” — próximos uns dos outros no espaço vetorial, uma vez que compartilham características comuns.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAIAAADzBuo/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAbElEQVR4nE3MyxKDIBBEUf///7LKLokMYwljcBDUGtrKY8H2nuoeAKA1a1h1887zHDQXO+3TgeHHUo1kf96JRnndHtEv394xV0wVkxqNi8TcrYGQdudX3sDppLlI6c8B1Rr5nQ6I5OBiPv58AbEskHFlEzXIAAAAAElFTkSuQmCC&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="299"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/pt/assets/ideal-img/image-4-pt.a0f9b0f.640.png" srcset="/pt/assets/ideal-img/image-4-pt.a0f9b0f.640.png 640w,/pt/assets/ideal-img/image-4-pt.4b5b72b.920.png 920w,/pt/assets/ideal-img/image-4-pt.843df88.1166.png 1166w" width="640" height="299"></noscript></div>
<br>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="o-que-são-embeddings">O Que São Embeddings?<a href="https://blog.tchez.dev/pt/vector-database/#o-que-s%C3%A3o-embeddings" class="hash-link" aria-label="Link direto para O Que São Embeddings?" title="Link direto para O Que São Embeddings?" translate="no">​</a></h2>
<p>Embeddings são uma forma de representar dados como vetores, onde itens semelhantes são posicionados próximos uns dos outros em um espaço multidimensional. Eles são amplamente utilizados em áreas como PNL para capturar relações entre palavras, imagens ou sons de forma mais eficaz do que métodos mais simples, como One-Hot Encoding.</p>
<p>Esses embeddings permitem que dados com características semelhantes se agrupem, o que torna a busca por similaridade e o agrupamento de informações relacionadas muito mais eficientes.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="uma-analogia-simples-cores-em-um-espaço-vetorial-3d">Uma Analogia Simples: Cores em um Espaço Vetorial 3D<a href="https://blog.tchez.dev/pt/vector-database/#uma-analogia-simples-cores-em-um-espa%C3%A7o-vetorial-3d" class="hash-link" aria-label="Link direto para Uma Analogia Simples: Cores em um Espaço Vetorial 3D" title="Link direto para Uma Analogia Simples: Cores em um Espaço Vetorial 3D" translate="no">​</a></h3>
<p>Para facilitar a compreensão, vamos considerar um exemplo familiar: cores no modelo <strong>RGBA</strong>. Cada cor é representada por quatro valores — as intensidades de vermelho, verde e azul, além de um canal alfa que controla a transparência — colocando-a em um espaço <strong>quatro-dimensional (4D)</strong>.</p>
<blockquote>
<p>Como não podemos visualizar quatro dimensões diretamente, simplificamos plotando apenas os componentes RGB em um espaço 3D. O valor alfa ainda existe, mas não é representado visualmente nesta visão.</p>
</blockquote>
<p>Por exemplo:</p>
<ul>
<li><strong>Vermelho:</strong> <code>[255, 0, 0, 1]</code></li>
<li><strong>Vermelho Claro:</strong> <code>[255, 0, 0, 0.5]</code></li>
<li><strong>Verde:</strong> <code>[0, 255, 0, 1]</code></li>
<li><strong>Azul:</strong> <code>[0, 0, 255, 1]</code></li>
</ul>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAIAAADzBuo/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAATUlEQVR4nF2LSQ7AMAgD8//P5hC1gAm4omnVxRdLnnEjyUySPsbWO9zzTO1kW1WOSKhCdjMD7I/LYEbGe/ngpWDGjEsqbB6i6sCj3O8D3imUbUXALZkAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="299"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/pt/assets/ideal-img/image-5-pt.e4e189f.640.png" srcset="/pt/assets/ideal-img/image-5-pt.e4e189f.640.png 640w,/pt/assets/ideal-img/image-5-pt.aaf9457.920.png 920w,/pt/assets/ideal-img/image-5-pt.460f5eb.1166.png 1166w" width="640" height="299"></noscript></div>
<br>
<p>Quando plotamos essas cores em um espaço 3D usando apenas os componentes RGB, podemos ver claramente que <strong>Vermelho</strong> e <strong>Vermelho Claro</strong> aparecem próximos um do outro, enquanto <strong>Verde</strong> e <strong>Azul</strong> estão localizados mais distantes. Essa proximidade espacial reflete quão semelhantes as cores são — neste caso, devido à sua intensidade vermelha compartilhada.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="representando-palavras-com-embeddings">Representando Palavras com Embeddings<a href="https://blog.tchez.dev/pt/vector-database/#representando-palavras-com-embeddings" class="hash-link" aria-label="Link direto para Representando Palavras com Embeddings" title="Link direto para Representando Palavras com Embeddings" translate="no">​</a></h3>
<p>Agora, vamos aplicar essa ideia a como representamos palavras. Em vez de usar três ou quatro dimensões como no modelo de cores RGB, as palavras são tipicamente representadas em <strong>espaços vetoriais com centenas ou até milhares de dimensões</strong>. Cada dimensão captura algum aspecto ou característica da palavra — como seu significado, contexto ou relações com outras palavras.</p>
<p>Por exemplo:</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAECAIAAAA4WjmaAAAACXBIWXMAAAsTAAALEwEAmpwYAAAASUlEQVR4nE2MUQrAIAxDvf8ZdwB/nEXYLF2TDudA85W8B0mxBf6Q3EmaFPCIcDeq9pzNx/w1v4wC3kUvka669Do3lKOdtYrI1C+2snX/h84AjgAAAABJRU5ErkJggg==&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="254"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/pt/assets/ideal-img/image-6-pt.b799715.640.png" srcset="/pt/assets/ideal-img/image-6-pt.b799715.640.png 640w,/pt/assets/ideal-img/image-6-pt.32bf442.920.png 920w,/pt/assets/ideal-img/image-6-pt.5a8e961.1166.png 1166w" width="640" height="254"></noscript></div>
<br>
<p>No exemplo acima, <strong>"cachorro"</strong> e <strong>"gato"</strong> aparecem próximos um do outro no espaço vetorial, porque ambos são animais de estimação e compartilham semelhanças contextuais. Por outro lado, <strong>"carro"</strong> e <strong>"floresta"</strong> estão posicionados mais distantes devido aos seus significados e padrões de uso muito diferentes.</p>
<blockquote>
<p>Ilustrativo apenas — nenhum modelo real foi utilizado pra gerar esses vetores.</p>
</blockquote>
<p>Esses <strong>espaços vetoriais de alta dimensão</strong> são gerados por <strong>modelos de embedding</strong>, que analisam grandes volumes de texto e aprendem a posicionar palavras com base nos contextos em que aparecem. Quanto mais próximas duas palavras estão no espaço, mais semanticamente semelhantes elas são.</p>
<p>Essa representação torna possível que as máquinas raciocinem sobre o significado — não apenas reconheçam correspondências exatas, mas <strong>entendam a relação</strong>. Essa é uma base fundamental para tarefas modernas de IA, como resposta a perguntas, tradução e busca semântica.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="explore-uma-representação-real-de-embedding">Explore uma Representação Real de Embedding<a href="https://blog.tchez.dev/pt/vector-database/#explore-uma-representa%C3%A7%C3%A3o-real-de-embedding" class="hash-link" aria-label="Link direto para Explore uma Representação Real de Embedding" title="Link direto para Explore uma Representação Real de Embedding" translate="no">​</a></h3>
<p>Se você gostaria de ver como os embeddings se parecem na prática, pode explorar uma visualização interativa ao vivo usando o <a href="https://projector.tensorflow.org/" target="_blank" rel="noopener noreferrer">TensorFlow Embedding Projector</a>. Esta ferramenta permite que você <strong>navegue por espaços vetoriais de alta dimensão</strong> e observe como palavras, imagens ou outros pontos de dados são organizados com base em suas relações semânticas.</p>
<p>Você verá algo semelhante ao exemplo abaixo, onde cada palavra é plotada em um espaço com até 200 dimensões, reduzido visualmente para 2D ou 3D usando técnicas de redução de dimensionalidade como <a href="https://pt.wikipedia.org/wiki/An%C3%A1lise_de_componentes_principais" target="_blank" rel="noopener noreferrer">PCA</a> ou <a href="https://www.datacamp.com/pt/tutorial/introduction-t-sne" target="_blank" rel="noopener noreferrer">t-SNE</a>.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAIAAAB1kpiRAAAACXBIWXMAAAsTAAALEwEAmpwYAAAArUlEQVR4nAXB0Q7BMBQA0P7/P3j1B0Q8iJAgoTPNem9rbadr141uMkbihTiHfL+/R3/rtKisDXVjDSolnHOxvXdBkOH5bJprH6MrS++D4Ht23HgfzhJjbMnj/cnTqcWlLryUAjJK96tcFTmeDOyIXLPFaOxLZlR+lhIROQBwJjLK0y0J2hWZ9aGqnAWUxyTJktV8NlHaGCXJ6z0MfV2HcFGgtUHgwBk9UCXS0uo/2+KaoJrbJGAAAAAASUVORK5CYII=&quot;)"><svg style="width:100%;height:auto;max-width:100%;margin-bottom:-4px" width="640" height="393"></svg><noscript><img style="width:100%;height:auto;max-width:100%;margin-bottom:-4px;position:absolute;top:0;left:0" src="/pt/assets/ideal-img/image-7.4bb9f52.640.png" srcset="/pt/assets/ideal-img/image-7.4bb9f52.640.png 640w,/pt/assets/ideal-img/image-7.29b8a8c.902.png 902w" width="640" height="393"></noscript></div>
<br>
<p>Nesta visualização, cada ponto representa uma palavra, e a proximidade entre eles reflete quão semelhantes seus significados são de acordo com o modelo de embedding. Por exemplo, a palavra <strong>“store”</strong> está cercada por palavras como <strong>“shop,” “market,”</strong> e <strong>“retail”</strong>, indicando que o modelo aprendeu sua semelhança contextual a partir de dados textuais em larga escala.</p>
<blockquote>
<p>Esse tipo de espaço de embedding permite que as máquinas não apenas reconheçam termos individuais, mas também entendam as relações entre eles — uma capacidade poderosa para tarefas como busca semântica, onde o objetivo é encontrar informações relevantes com base no significado, em vez de correspondências exatas.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-vector-db-works">Como Funciona um Banco de Dados Vetorial?<a href="https://blog.tchez.dev/pt/vector-database/#how-vector-db-works" class="hash-link" aria-label="Link direto para Como Funciona um Banco de Dados Vetorial?" title="Link direto para Como Funciona um Banco de Dados Vetorial?" translate="no">​</a></h2>
<p>Agora que cobrimos os conceitos básicos, podemos entender melhor como os <strong>bancos de dados vetoriais</strong> operam. Um banco de dados vetorial organiza dados na forma de vetores, que ocupam posições em <strong>espaço multidimensional</strong>. O principal objetivo é permitir a <strong>busca semântica</strong> — ou seja, encontrar itens semelhantes com base em sua <strong>proximidade vetorial</strong>, em vez de correspondências exatas como em bancos de dados tradicionais.</p>
<p>Por exemplo, imagine um banco de dados de imagens onde cada imagem é representada como um vetor que captura suas características visuais — como cor, forma e textura. Se você quiser encontrar imagens semelhantes a uma imagem específica de um gato, o banco de dados vetorial calculará a <strong>distância</strong> entre o vetor da imagem de consulta e os vetores de outras imagens armazenadas. Aqueles com a <strong>menor distância</strong> serão retornados como resultados, uma vez que compartilham características semelhantes.</p>
<p>Uma aplicação comum desse tipo é o <strong>reconhecimento facial</strong>, onde a semelhança entre o vetor de um rosto capturado e o de um rosto registrado pode indicar uma correspondência potencial.</p>
<p>Mas como exatamente a semelhança entre vetores é medida?</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="distância-vetorial-e-busca-por-similaridade">Distância Vetorial e Busca por Similaridade<a href="https://blog.tchez.dev/pt/vector-database/#dist%C3%A2ncia-vetorial-e-busca-por-similaridade" class="hash-link" aria-label="Link direto para Distância Vetorial e Busca por Similaridade" title="Link direto para Distância Vetorial e Busca por Similaridade" translate="no">​</a></h3>
<p>Em um banco de dados vetorial, itens com características semelhantes são agrupados próximos uns dos outros em um <strong>espaço multidimensional</strong>. A "proximidade" — ou <strong>similaridade</strong> — entre os itens é determinada por métricas de <strong>distância</strong> específicas, como <a href="https://pt.wikipedia.org/wiki/Dist%C3%A2ncia_euclidiana" target="_blank" rel="noopener noreferrer"><strong>distância euclidiana</strong></a> ou <a href="https://pt.wikipedia.org/wiki/Similaridade_por_cosseno" target="_blank" rel="noopener noreferrer"><strong>similaridade por cosseno</strong></a>.</p>
<p>No caso de buscas por palavras, como em nosso exemplo anterior de embeddings, um banco de dados vetorial pode retornar palavras que estão semanticamente próximas da consulta. Por exemplo, se você pesquisar pela palavra <strong>"feline"</strong>, o banco de dados pode retornar <strong>"cat," "tiger,"</strong> ou <strong>"leopard"</strong>, com base em quão próximos seus vetores estão no espaço semântico.</p>
<blockquote>
<p>Esse tipo de correspondência baseada em vetores permite que os sistemas vão além de palavras-chave superficiais e encontrem resultados que estão <strong>significativamente relacionados</strong>, mesmo quando as palavras exatas não correspondem — uma grande vantagem em aplicações modernas de IA.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="aplicações-de-bancos-de-dados-vetoriais">Aplicações de Bancos de Dados Vetoriais<a href="https://blog.tchez.dev/pt/vector-database/#aplica%C3%A7%C3%B5es-de-bancos-de-dados-vetoriais" class="hash-link" aria-label="Link direto para Aplicações de Bancos de Dados Vetoriais" title="Link direto para Aplicações de Bancos de Dados Vetoriais" translate="no">​</a></h2>
<p>Os bancos de dados vetoriais já estão sendo amplamente utilizados para resolver desafios relacionados a <strong>dados não estruturados</strong> em vários domínios. Aqui estão alguns exemplos práticos:</p>
<ul>
<li>
<p><strong>Busca de Imagens</strong>: Sistemas médicos e plataformas como o Google Imagens usam bancos de dados vetoriais para encontrar imagens visualmente semelhantes com base em características como cor, forma e textura — o que ajuda em diagnósticos e descoberta de conteúdo.</p>
</li>
<li>
<p><strong>Recomendações de Produtos</strong>: No comércio eletrônico, os bancos de dados vetoriais sugerem produtos com base em buscas anteriores ou no histórico de compras do usuário, permitindo uma experiência de compra mais personalizada.</p>
</li>
<li>
<p><strong>Reconhecimento Facial</strong>: Sistemas de segurança usam bancos de dados vetoriais para comparar imagens faciais, identificando correspondências com alta precisão — tornando a autenticação e vigilância mais eficazes.</p>
</li>
<li>
<p><a href="https://en.wikipedia.org/wiki/Retrieval-augmented_generation" target="_blank" rel="noopener noreferrer"><strong>RAG (Geração Aumentada por Recuperação)</strong></a>: Essa técnica combina a recuperação de documentos de bancos de dados vetoriais com as capacidades de geração de respostas de grandes modelos de linguagem (LLMs). Isso permite que esses modelos se especializem em tópicos específicos sem exigir re-treinamento.</p>
</li>
</ul>
<blockquote>
<p><em>No meu <a href="https://www.linkedin.com/posts/tchez_jornadadeiniciaaexaetocientaedfica-praeamiojovempesquisador-activity-7263597654570369024-2PqS?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAADUhp3MBjeUrhJg0P5LSvpRa8yf14r7iP3Y" target="_blank" rel="noopener noreferrer">trabalho de conclusão de curso</a>, utilizei RAG para construir um chatbot focado em saúde mental. O sistema recupera informações relevantes e fornece respostas mais precisas e contextualizadas.</em></p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusão">Conclusão<a href="https://blog.tchez.dev/pt/vector-database/#conclus%C3%A3o" class="hash-link" aria-label="Link direto para Conclusão" title="Link direto para Conclusão" translate="no">​</a></h2>
<p>À medida que os dados não estruturados continuam a crescer exponencialmente, <strong>os bancos de dados vetoriais estão se tornando essenciais para recuperar informações de forma eficiente e significativa</strong>. Ao permitir a <strong>busca baseada em similaridade</strong> em vez de depender de correspondências exatas, eles abrem novas possibilidades para interagir com dados complexos de maneiras mais intuitivas e inteligentes.</p>
<p>Desde aplicações como <strong>busca de imagens</strong>, <strong>recomendações de produtos</strong> e <strong>reconhecimento facial</strong>, até o suporte a técnicas avançadas como <strong>RAG</strong>, os bancos de dados vetoriais estão prontos para desempenhar um papel fundamental no futuro da inteligência artificial. Eles ajudam a preencher a lacuna entre dados brutos e conhecimento acionável — impulsionando a inovação em diversos setores.</p>
<p>Em um mundo onde contexto e significado importam mais do que nunca, os bancos de dados vetoriais oferecem uma mudança de paradigma. Ao interpretar dados <strong>semânticamente</strong>, eles têm o potencial de <strong>revolucionar a forma como armazenamos, recuperamos e entendemos informações</strong> — conectando os sistemas digitais de hoje com as tecnologias orientadas ao conhecimento de amanhã.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="referências">Referências<a href="https://blog.tchez.dev/pt/vector-database/#refer%C3%AAncias" class="hash-link" aria-label="Link direto para Referências" title="Link direto para Referências" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>Links</strong></summary><div><div class="collapsibleContent_i85q"><ul>
<li><a href="https://www.oracle.com/br/big-data/what-is-big-data" target="_blank" rel="noopener noreferrer">What is Big Data? – Oracle</a></li>
<li><a href="https://www.oracle.com/br/database/what-is-database" target="_blank" rel="noopener noreferrer">What is a Database? – Oracle</a></li>
<li><a href="https://aws.amazon.com/pt/what-is/database" target="_blank" rel="noopener noreferrer">What is a Database? – AWS</a></li>
<li><a href="https://aws.amazon.com/pt/what-is/vector-databases" target="_blank" rel="noopener noreferrer">What is a Vector Database? – AWS</a></li>
<li><a href="https://www.elastic.co/pt/what-is/vector-embedding" target="_blank" rel="noopener noreferrer">What is a Vector Embedding? – Elastic</a></li>
<li><a href="https://medium.com/turing-talks/word-embedding-fazendo-o-computador-entender-o-significado-das-palavras-92fe22745057" target="_blank" rel="noopener noreferrer">Word Embedding: Making Computers Understand Word Meaning – Turing Talks</a></li>
<li><a href="https://developers.google.com/machine-learning/crash-course/embeddings?hl=pt-br" target="_blank" rel="noopener noreferrer">Embeddings – Google Machine Learning Crash Course</a></li>
<li><a href="https://aws.amazon.com/pt/what-is/retrieval-augmented-generation" target="_blank" rel="noopener noreferrer">What is Retrieval-Augmented Generation (RAG)? – AWS</a></li>
</ul></div></div></details>]]></content:encoded>
            <category>rag</category>
            <category>ai</category>
            <category>programming</category>
            <category>article</category>
        </item>
        <item>
            <title><![CDATA[Você sabe o que são métodos mágicos em Python? Dica: Você usa todos os dias!]]></title>
            <link>https://blog.tchez.dev/pt/dunder-methods/</link>
            <guid>https://blog.tchez.dev/pt/dunder-methods/</guid>
            <pubDate>Wed, 11 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Neste artigo, vamos explorar o fascinante mundo dos métodos mágicos em Python, seu propósito e como eles podem aprimorar sua experiência de codificação.]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>Este artigo foi originalmente publicado em <a href="https://www.linkedin.com/pulse/voc%25C3%25AA-sabe-o-que-s%25C3%25A3o-m%25C3%25A9todos-m%25C3%25A1gicos-em-python-dica-os-marco-ant%25C3%25B4nio-zcgbf" target="_blank" rel="noopener noreferrer">LinkedIn</a></p>
</blockquote>
<p><img decoding="async" loading="lazy" alt="Dunder Methods" src="https://blog.tchez.dev/pt/assets/images/article-og-8dfb080971478ddeca220d443fe31cca.png" width="1260" height="720" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="você-sabe-o-que-são-métodos-mágicos-em-python-dica-você-usa-todos-os-dias">Você sabe o que são métodos mágicos em Python? Dica: Você usa todos os dias!<a href="https://blog.tchez.dev/pt/dunder-methods/#voc%C3%AA-sabe-o-que-s%C3%A3o-m%C3%A9todos-m%C3%A1gicos-em-python-dica-voc%C3%AA-usa-todos-os-dias" class="hash-link" aria-label="Link direto para Você sabe o que são métodos mágicos em Python? Dica: Você usa todos os dias!" title="Link direto para Você sabe o que são métodos mágicos em Python? Dica: Você usa todos os dias!" translate="no">​</a></h2>
<p>Há alguns anos, quando estava aprendendo a usar o framework Django (o primeiro framework que aprendi), me deparei com uma característica peculiar das classes Python: o método construtor deve seguir um padrão específico — ele deve ser identificado por underscores duplos (__) antes e depois da palavra <code>init</code>. Isso me chamou a atenção; por que essa estrutura específica?</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">MinhaClasse</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Este é o método construtor</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><br></span></code></pre></div></div>
<p>Tentando entender de onde vieram essas funções 'diferentes', descobri que no mundo do Python, existem vários métodos que seguem esse padrão 'dunder' (um apelido derivado de Double UNDERscore). Esses métodos não são apenas comuns — eles são especiais e fundamentais para a linguagem, conhecidos como dunder methods ou métodos mágicos.</p>
<p>OK, mas o que esses métodos realmente fazem? O que os torna 'mágicos'?</p>
<p>Essas foram algumas das perguntas que me levaram a estudá-los mais profundamente e a escrever este artigo. Espero que você goste :)</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="o-que-são-dunder-methods">O que são dunder methods?<a href="https://blog.tchez.dev/pt/dunder-methods/#o-que-s%C3%A3o-dunder-methods" class="hash-link" aria-label="Link direto para O que são dunder methods?" title="Link direto para O que são dunder methods?" translate="no">​</a></h2>
<p>No mundo da programação, muitas vezes nos deparamos com conceitos que parecem complexos à primeira vista, mas que, uma vez compreendidos, fazem total sentido. Um ótimo exemplo disso em Python são os <em>dunder methods</em>.</p>
<p>Então, o que exatamente são esses métodos? Como mencionado anteriormente, a palavra 'dunder' refere-se à notação de underscore duplo no início e no final dos nomes desses métodos especiais. Por exemplo, <code>__init__</code> para um construtor de classe, ou <code>__str__</code> para a representação em string de um objeto.</p>
<blockquote>
<p>P.S. Alguns puristas pythonicos não gostam de chamar o método <code>__init__</code> de construtor, pois tecnicamente ele é um inicializador. No entanto, para simplificar, vamos nos referir a ele como construtor neste artigo.</p>
</blockquote>
<p>Esses métodos não são chamados diretamente pelo nome. Em vez disso, o Python os chama internamente quando certas ações são realizadas. Por exemplo, quando adicionamos dois objetos usando o operador <code>+</code>, o Python chama internamente o método <code>__add__</code>, que lida com a lógica de adicionar um valor a outro.</p>
<blockquote>
<p>Ficou confuso? Vou dar alguns exemplos para facilitar!</p>
</blockquote>
<p>Imagine que você está construindo uma classe para representar um livro em uma biblioteca. Para fazer isso, você precisará implementar o método <code>__init__</code>, que atua como um construtor, configurando atributos iniciais como título, autor e contagem de páginas:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> titulo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> autor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> paginas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo </span><span class="token operator">=</span><span class="token plain"> titulo</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor </span><span class="token operator">=</span><span class="token plain"> autor</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas </span><span class="token operator">=</span><span class="token plain"> paginas</span><br></span></code></pre></div></div>
<p>O que acontece quando você tenta adicionar dois objetos <code>Livro</code>? Você pode esperar que eles se combinem de alguma forma, mas o Python não sabe como lidar com essa operação por padrão:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro1 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Primeiro Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor A"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro2 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Segundo Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor B"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">200</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1 </span><span class="token operator">+</span><span class="token plain"> livro2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Isso levantará um <code>TypeError</code> porque o Python não sabe como adicionar dois objetos <code>Livro</code>. Este código irá gerar:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span><span class="token plain"> TypeError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> unsupported operand </span><span class="token builtin" style="color:rgb(189, 147, 249)">type</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">s</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> </span><span class="token operator">+</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Livro'</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">and</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'Livro'</span><br></span></code></pre></div></div>
<p>Para fazer essa operação funcionar, você pode definir o método <code>__add__</code> na sua classe <code>Livro</code>. Este método especificará como dois objetos <code>Livro</code> devem ser adicionados. Por exemplo, você pode querer adicionar suas contagens de páginas:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> titulo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> autor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> paginas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo </span><span class="token operator">=</span><span class="token plain"> titulo</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor </span><span class="token operator">=</span><span class="token plain"> autor</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas </span><span class="token operator">=</span><span class="token plain"> paginas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__add__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> other</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas </span><span class="token operator">+</span><span class="token plain"> other</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas</span><br></span></code></pre></div></div>
<p>Agora, quando você tenta adicionar dois objetos <code>Livro</code>, o Python chamará o método <code>__add__</code>, que neste caso somará a quantidade de páginas. É assim que você pode personalizar o comportamento dos operadores para suas próprias classes.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro1 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Primeiro Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor A"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro2 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Segundo Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor B"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">200</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1 </span><span class="token operator">+</span><span class="token plain"> livro2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: 300</span><br></span></code></pre></div></div>
<p><strong>Esse comportamento não se limita apenas ao operador de adição!</strong></p>
<p>Na verdade, a maioria dos operadores em Python pode ser personalizada usando dunder methods. Por exemplo, você pode definir como sua classe se comporta com o operador <code>==</code> implementando o método <code>__eq__</code>, ou com o operador <code>-</code> implementando o método <code>__sub__</code>. Um bom exemplo disso é o operador <code>in</code>, quando verificamos se algum <code>valor</code> está <code>in</code> uma <code>lista</code>, por baixo dos panos, o Python está chamando o método <code>__contains__</code> da classe lista, passando o <code>valor</code> como argumento. Veja o exemplo abaixo:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">minha_lista </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">4</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">3</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> minha_lista</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">minha_lista</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">__contains__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso também vai imprimir: True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">6</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> minha_lista</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: False</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">minha_lista</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">__contains__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso também vai imprimir: False</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mais-exemplos-de-dunder-methods">Mais exemplos de dunder methods<a href="https://blog.tchez.dev/pt/dunder-methods/#mais-exemplos-de-dunder-methods" class="hash-link" aria-label="Link direto para Mais exemplos de dunder methods" title="Link direto para Mais exemplos de dunder methods" translate="no">​</a></h2>
<p>Agora que você tem uma compreensão básica do que são os dunder methods e como funcionam, vamos ver mais alguns exemplos de seu uso, ainda aplicados à classe <code>Livro</code>:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="__str__-customizando-prints"><code>__str__</code>: Customizando prints<a href="https://blog.tchez.dev/pt/dunder-methods/#__str__-customizando-prints" class="hash-link" aria-label="Link direto para __str__-customizando-prints" title="Link direto para __str__-customizando-prints" translate="no">​</a></h3>
<p>Seguindo o exemplo anterior, o que acontece quando você tenta imprimir um objeto <code>Livro</code>? Por padrão, o Python mostrará algo como <code>&lt;__main__.Book object at 0x...&gt;</code>, que não é muito informativo:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro1 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Primeiro Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor A"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Isso vai imprimir algo como:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token operator">&gt;&gt;</span><span class="token operator">&gt;</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain">__main__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">Book </span><span class="token builtin" style="color:rgb(189, 147, 249)">object</span><span class="token plain"> at </span><span class="token number">0x7f8c1b0d0</span><span class="token operator">&gt;</span><br></span></code></pre></div></div>
<p>Se você está se perguntando se é possível personalizar essa saída, tornando a representação mais amigável ao usuário, sim, é! Você só precisa implementar o método mágico chamado <code>__str__</code> em sua classe. Esse método permite que você defina como seu objeto deve ser representado como uma <em>string</em>. Então, vamos fazer isso:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> titulo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> autor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> paginas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo </span><span class="token operator">=</span><span class="token plain"> titulo</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor </span><span class="token operator">=</span><span class="token plain"> autor</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas </span><span class="token operator">=</span><span class="token plain"> paginas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__str__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">titulo</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> por </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">autor</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)">, </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token string-interpolation interpolation">paginas</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token string-interpolation string" style="color:rgb(255, 121, 198)"> páginas"</span><br></span></code></pre></div></div>
<p>Agora, quando você imprime um objeto <code>Livro</code>, ele exibirá o título, autor e contagem de páginas em um formato mais legível:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro1 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Primeiro Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor A"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: Primeiro Livro por Autor A, 100 páginas</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="__eq__-customizando-verificações-de-igualdade"><code>__eq__</code>: Customizando verificações de igualdade<a href="https://blog.tchez.dev/pt/dunder-methods/#__eq__-customizando-verifica%C3%A7%C3%B5es-de-igualdade" class="hash-link" aria-label="Link direto para __eq__-customizando-verificações-de-igualdade" title="Link direto para __eq__-customizando-verificações-de-igualdade" translate="no">​</a></h3>
<p>E se você quiser verificar se dois objetos <code>Livro</code> são considerados iguais? Por padrão, o Python verifica se eles são o mesmo objeto na memória, o que pode não ser o que você deseja. Para personalizar esse comportamento, você pode implementar o método <code>__eq__</code>:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> titulo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> autor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> paginas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo </span><span class="token operator">=</span><span class="token plain"> titulo</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor </span><span class="token operator">=</span><span class="token plain"> autor</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas </span><span class="token operator">=</span><span class="token plain"> paginas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__eq__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> other</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo </span><span class="token operator">==</span><span class="token plain"> other</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">and</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor </span><span class="token operator">==</span><span class="token plain"> other</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">and</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas </span><span class="token operator">==</span><span class="token plain"> other</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Agora, você pode comparar a igualdade de dois objetos <code>Livro</code> com base em seus atributos:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro1 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Primeiro Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor A"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro2 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Segundo Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor B"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">200</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro3 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Primeiro Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor A"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1 </span><span class="token operator">==</span><span class="token plain"> livro2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: False</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1 </span><span class="token operator">==</span><span class="token plain"> livro3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: True</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">__eq__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: True</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="__len__-customizando-verificações-de-comprimento"><code>__len__</code>: Customizando verificações de comprimento<a href="https://blog.tchez.dev/pt/dunder-methods/#__len__-customizando-verifica%C3%A7%C3%B5es-de-comprimento" class="hash-link" aria-label="Link direto para __len__-customizando-verificações-de-comprimento" title="Link direto para __len__-customizando-verificações-de-comprimento" translate="no">​</a></h3>
<p>E se você quiser verificar quantas páginas um livro tem? Você pode verificar manualmente o atributo <code>paginas</code>, mas também pode implementar o método <code>__len__</code> para permitir o uso da função embutida <code>len()</code>:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> titulo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> autor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> paginas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo </span><span class="token operator">=</span><span class="token plain"> titulo</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor </span><span class="token operator">=</span><span class="token plain"> autor</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas </span><span class="token operator">=</span><span class="token plain"> paginas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__len__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas</span><br></span></code></pre></div></div>
<p>Agora, você pode usar a função <code>len()</code> em um objeto <code>Livro</code>:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro1 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Primeiro Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor A"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token builtin" style="color:rgb(189, 147, 249)">len</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: 100</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="__getitem__-customizando-o-acesso-a-itens"><code>__getitem__</code>: Customizando o acesso a itens<a href="https://blog.tchez.dev/pt/dunder-methods/#__getitem__-customizando-o-acesso-a-itens" class="hash-link" aria-label="Link direto para __getitem__-customizando-o-acesso-a-itens" title="Link direto para __getitem__-customizando-o-acesso-a-itens" translate="no">​</a></h3>
<p>Por último, e se você quiser acessar um atributo específico de um objeto <code>Livro</code> usando indexação, como <code>livro[0]</code> para o título? Você pode implementar o método <code>__getitem__</code>:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__init__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> titulo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> autor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> paginas</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo </span><span class="token operator">=</span><span class="token plain"> titulo</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor </span><span class="token operator">=</span><span class="token plain"> autor</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas </span><span class="token operator">=</span><span class="token plain"> paginas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">__getitem__</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> index </span><span class="token operator">==</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">titulo</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">elif</span><span class="token plain"> index </span><span class="token operator">==</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">autor</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">elif</span><span class="token plain"> index </span><span class="token operator">==</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">paginas</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">raise</span><span class="token plain"> IndexError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Índice fora do alcance"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Agora, você pode acessar o título, autor e páginas de um objeto <code>Livro</code> usando indexação:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">livro1 </span><span class="token operator">=</span><span class="token plain"> Livro</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Primeiro Livro"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Autor A"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: Primeiro Livro</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: Autor A</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">print</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">livro1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Isso vai imprimir: 100</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusão">Conclusão<a href="https://blog.tchez.dev/pt/dunder-methods/#conclus%C3%A3o" class="hash-link" aria-label="Link direto para Conclusão" title="Link direto para Conclusão" translate="no">​</a></h2>
<p>Esses foram apenas alguns exemplos que destacam o poder e a flexibilidade dos dunder methods em Python. Com eles, você pode moldar o comportamento de suas classes e objetos de maneiras que se alinham com a sintaxe e os paradigmas da linguagem, tornando seu código mais intuitivo e 'Pythonico'.</p>
<p>Então, da próxima vez que você estiver projetando uma classe Python, lembre-se da magia dos dunder methods e de como eles podem enriquecer suas abstrações!</p>
<p>Abaixo, deixarei uma lista de alguns dos dunder methods mais usados em Python, cada um vinculado à documentação oficial:</p>
<ul>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__init__" target="_blank" rel="noopener noreferrer"><code>__init__</code></a>: O método construtor, chamado quando um objeto é criado.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__add__" target="_blank" rel="noopener noreferrer"><code>__add__</code></a>: Define o comportamento do operador de adição (<code>+</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__contains__" target="_blank" rel="noopener noreferrer"><code>__contains__</code></a>: Define o comportamento do operador <code>in</code> para um objeto.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__str__" target="_blank" rel="noopener noreferrer"><code>__str__</code></a>: Define a representação em string de um objeto, usada pela função <code>print()</code>.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__eq__" target="_blank" rel="noopener noreferrer"><code>__eq__</code></a>: Define o comportamento do operador de igualdade (<code>==</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__len__" target="_blank" rel="noopener noreferrer"><code>__len__</code></a>: Define o comportamento da função <code>len()</code> para um objeto.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__getitem__" target="_blank" rel="noopener noreferrer"><code>__getitem__</code></a>: Define o comportamento da indexação de um objeto (por exemplo, <code>obj[key]</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__setitem__" target="_blank" rel="noopener noreferrer"><code>__setitem__</code></a>: Define o comportamento de definir um item em um objeto (por exemplo, <code>obj[key] = value</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__delitem__" target="_blank" rel="noopener noreferrer"><code>__delitem__</code></a>: Define o comportamento de deletar um item de um objeto (por exemplo, <code>del obj[key]</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__repr__" target="_blank" rel="noopener noreferrer"><code>__repr__</code></a>: Define a representação oficial de um objeto, usada pela função <code>repr()</code>.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__ne__" target="_blank" rel="noopener noreferrer"><code>__ne__</code></a>: Define o comportamento do operador de desigualdade (<code>!=</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__lt__" target="_blank" rel="noopener noreferrer"><code>__lt__</code></a>: Define o comportamento do operador menor que (<code>&lt;</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__le__" target="_blank" rel="noopener noreferrer"><code>__le__</code></a>: Define o comportamento do operador menor ou igual a (<code>&lt;=</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__gt__" target="_blank" rel="noopener noreferrer"><code>__gt__</code></a>: Define o comportamento do operador maior que (<code>&gt;</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__ge__" target="_blank" rel="noopener noreferrer"><code>__ge__</code></a>: Define o comportamento do operador maior ou igual a (<code>&gt;=</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__sub__" target="_blank" rel="noopener noreferrer"><code>__sub__</code></a>: Define o comportamento do operador de subtração (<code>-</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__mul__" target="_blank" rel="noopener noreferrer"><code>__mul__</code></a>: Define o comportamento do operador de multiplicação (<code>*</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__truediv__" target="_blank" rel="noopener noreferrer"><code>__truediv__</code></a>: Define o comportamento do operador de divisão verdadeira (<code>/</code>).</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__bool__" target="_blank" rel="noopener noreferrer"><code>__bool__</code></a>: Define o valor de verdade de um objeto, usado pela função <code>bool()</code>.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__iter__" target="_blank" rel="noopener noreferrer"><code>__iter__</code></a>: Define o comportamento de um objeto quando usado em um loop ou com a função <code>iter()</code>.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__next__" target="_blank" rel="noopener noreferrer"><code>__next__</code></a>: Define o comportamento da função <code>next()</code> para um objeto, permitindo que ele seja iterável.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__enter__" target="_blank" rel="noopener noreferrer"><code>__enter__</code></a>: Define o comportamento de um objeto quando usado em uma instrução <code>with</code>, permitindo que ele configure um contexto.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__exit__" target="_blank" rel="noopener noreferrer"><code>__exit__</code></a>: Define o comportamento de um objeto ao sair de uma instrução <code>with</code>, permitindo que ele limpe recursos.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__hash__" target="_blank" rel="noopener noreferrer"><code>__hash__</code></a>: Define o comportamento da função <code>hash()</code> para um objeto, permitindo que ele seja usado em coleções baseadas em hash, como conjuntos e dicionários.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__del__" target="_blank" rel="noopener noreferrer"><code>__del__</code></a>: Define o comportamento de um objeto quando está prestes a ser destruído, permitindo ações de limpeza.</li>
</ul>
<p>Espero que este artigo tenha esclarecido um pouco sobre o fascinante mundo dos dunder methods em Python. Se você tiver alguma dúvida ou quiser compartilhar suas experiências com dunder methods, sinta-se à vontade para entrar em contato!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="referências">Referências<a href="https://blog.tchez.dev/pt/dunder-methods/#refer%C3%AAncias" class="hash-link" aria-label="Link direto para Referências" title="Link direto para Referências" translate="no">​</a></h2>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary><strong>Links</strong></summary><div><div class="collapsibleContent_i85q"><ul>
<li><a href="https://docs.python.org/3/reference/datamodel.html" target="_blank" rel="noopener noreferrer">Python Official Documentation - Data Model</a></li>
<li><a href="https://mathspp.com/blog/pydonts/dunder-methods" target="_blank" rel="noopener noreferrer">Dunder methods | Pydon't 🐍</a></li>
<li><a href="https://nitesh-yadav.medium.com/dunder-methods-in-python-really-crazy-functions-3455ecb6472d" target="_blank" rel="noopener noreferrer">Dunder methods in Python, really crazy functions</a></li>
</ul></div></div></details>]]></content:encoded>
            <category>python</category>
            <category>programação</category>
            <category>artigo</category>
        </item>
        <item>
            <title><![CDATA[Bem‑vindo ao Brain Blog 🎉]]></title>
            <link>https://blog.tchez.dev/pt/welcome/</link>
            <guid>https://blog.tchez.dev/pt/welcome/</guid>
            <pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Meu espaço pessoal para compartilhar ideias e despejar conhecimento estruturado.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Brain&nbsp;Blog" src="https://blog.tchez.dev/pt/assets/images/logo-og-2f341927a68b033b11836f1447dc586f.png" width="1200" height="630" class="img_ev3q"></p>
<p>Olá, mundo! 👋</p>
<p>Sou <a href="https://www.linkedin.com/in/tchez" target="_blank" rel="noopener noreferrer">Marco&nbsp;Antônio</a> e este é o meu <strong>Brain&nbsp;Blog</strong>.</p>
<p>Esta publicação é uma explicação do que você vai encontrar por aqui.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="por-que-brainblog">Por que “Brain&nbsp;Blog”?<a href="https://blog.tchez.dev/pt/welcome/#por-que-brainblog" class="hash-link" aria-label="Link direto para Por que “Brain&nbsp;Blog”?" title="Link direto para Por que “Brain&nbsp;Blog”?" translate="no">​</a></h3>
<blockquote>
<p><em>“Quem ensina aprende ao ensinar. E quem aprende ensina ao aprender.”</em>
— Paulo Freire</p>
</blockquote>
<p>A ideia do Brain&nbsp;Blog é fazer um 'backup' do meu cérebro, onde anoto meus estudos, organizo referências e documento minhas jornadas de aprendizado.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="estrutura-do-conteúdo">Estrutura do conteúdo<a href="https://blog.tchez.dev/pt/welcome/#estrutura-do-conte%C3%BAdo" class="hash-link" aria-label="Link direto para Estrutura do conteúdo" title="Link direto para Estrutura do conteúdo" translate="no">​</a></h3>
<blockquote>
<p>Meu espaço pessoal para compartilhar ideias e conhecimento.</p>
</blockquote>
<p>Aqui você encontrará artigos, tutoriais e reflexões sobre temas que me interessam. Compartilharei também experiências e aprendizados que considero relevantes.</p>]]></content:encoded>
            <category>blog</category>
        </item>
    </channel>
</rss>