<?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/</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>en</language>
        <item>
            <title><![CDATA[From Data to Knowledge: The Power of Vector Databases]]></title>
            <link>https://blog.tchez.dev/vector-database/</link>
            <guid>https://blog.tchez.dev/vector-database/</guid>
            <pubDate>Thu, 12 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In a world flooded with unstructured data, how can we store not just information, but knowledge itself? This article dives into vector databases — a revolutionary approach that enables similarity-based search and semantic understanding. Learn how vectors and embeddings reshape data storage, power advanced AI applications, and mark a shift from traditional databases to knowledge-driven systems.]]></description>
            <content:encoded><![CDATA[<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAGCAYAAAD68A/GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAo0lEQVR4nDWOuwqEUAxE4xNfiAg2NmrhD9gJNv6HoNhpYenvn2Xu7hZDEnKSGfM8j7983ycMQ6qqIs9zoigiCALMDCuKwgEa4jimrmsHZlnmIO30xIZh4Loutm1j33eO4+B5Ht735TxP7vumaRqsLEvatqXve6ZpYlkW1nVlnmfGcaTrOsSYsqRp6iQ7WUuK4bKZfa2TJEE5dSUL9YLc8geqfgBZOU2z+obcgQAAAABJRU5ErkJggg==&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="/assets/ideal-img/article-og.3df207f.640.png" srcset="/assets/ideal-img/article-og.3df207f.640.png 640w,/assets/ideal-img/article-og.593f6a5.920.png 920w,/assets/ideal-img/article-og.fadd616.1200.png 1200w" width="640" height="360"></noscript></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="from-data-to-knowledge-the-power-of-vector-databases">From Data to Knowledge: The Power of Vector Databases<a href="https://blog.tchez.dev/vector-database/#from-data-to-knowledge-the-power-of-vector-databases" class="hash-link" aria-label="Direct link to From Data to Knowledge: The Power of Vector Databases" title="Direct link to From Data to Knowledge: The Power of Vector Databases" translate="no">​</a></h2>
<p><strong>In a world flooded with unstructured data, how can we store not just information, but knowledge itself?</strong></p>
<p>This article explores the rise of <strong>vector databases</strong> — a revolutionary technology that enables similarity-based search and semantic understanding. We'll break down what vectors are, how they're used in <a href="https://en.wikipedia.org/wiki/Natural_language_processing" target="_blank" rel="noopener noreferrer">Natural Language Processing (NLP)</a> and how <strong>embeddings</strong> allow for efficient, contextualized representations of information. Finally, we’ll explore real-world applications and why vector databases are becoming essential in modern AI systems.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-rise-of-unstructured-data">The Rise of Unstructured Data<a href="https://blog.tchez.dev/vector-database/#the-rise-of-unstructured-data" class="hash-link" aria-label="Direct link to The Rise of Unstructured Data" title="Direct link to The Rise of Unstructured Data" translate="no">​</a></h3>
<p>With the advance of <a href="https://en.wikipedia.org/wiki/Big_Data" target="_blank" rel="noopener noreferrer">Big Data</a>, billions of connected devices generate real-time information in the form of text, images, videos, and more. These unstructured formats don't fit well into traditional SQL tables and demand more sophisticated storage solutions. This is where <strong>vector databases</strong> emerge as a game-changing approach, enabling similarity-based searches and unlocking knowledge from complex data.</p>
<p>Before we dive into how vector databases work, let’s first recapitulate the fundamentals of databases.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-a-database">What Is a Database?<a href="https://blog.tchez.dev/vector-database/#what-is-a-database" class="hash-link" aria-label="Direct link to What Is a Database?" title="Direct link to What Is a Database?" translate="no">​</a></h2>
<p>A <strong>database</strong> is, simply put, an organized collection of information that can be efficiently accessed, managed and updated. It acts as a structure that stores and organizes data, making it easy to query and manipulate using specialized software.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="relational-databases">Relational Databases<a href="https://blog.tchez.dev/vector-database/#relational-databases" class="hash-link" aria-label="Direct link to Relational Databases" title="Direct link to Relational Databases" translate="no">​</a></h3>
<p><strong>Relational databases</strong> are the most commonly used type. They store data in tables organized into rows and columns — where each row represents a record and each column represents a field or attribute. This model is ideal for structured data such as customer records, bank transactions, or product inventories.</p>
<p>A classic example is a customer database with columns for name, address, phone number and email. Relational databases enable fast and precise queries like “find all customers who made a purchase in the last 30 days,” using a language known as <a href="https://en.wikipedia.org/wiki/SQL" target="_blank" rel="noopener noreferrer">SQL (Structured Query Language)</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="non-relational-databases-nosql">Non-Relational Databases (NoSQL)<a href="https://blog.tchez.dev/vector-database/#non-relational-databases-nosql" class="hash-link" aria-label="Direct link to Non-Relational Databases (NoSQL)" title="Direct link to Non-Relational Databases (NoSQL)" translate="no">​</a></h3>
<p>Unlike relational databases, <strong>NoSQL databases</strong> are designed to handle unstructured or semi-structured data, offering more flexibility and scalability. They store information in diverse formats such as JSON documents, key-value pairs or <a href="https://en.wikipedia.org/wiki/Graph" target="_blank" rel="noopener noreferrer">graphs</a>. This makes them better suited for modern applications like social-media platforms or streaming services.</p>
<p>For instance, a document-oriented NoSQL database might store data in JSON format, allowing for more complex and nested data structures — without requiring a rigid schema.</p>
<p>Among the categories of non-relational databases, <strong>vector databases</strong> stand out for their ability to store contextualized data — also known as <strong>knowledge</strong>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="vector-databases">Vector Databases<a href="https://blog.tchez.dev/vector-database/#vector-databases" class="hash-link" aria-label="Direct link to Vector Databases" title="Direct link to Vector Databases" translate="no">​</a></h3>
<p><strong>Vector databases</strong> introduce a transformative approach tailored to store and retrieve data as <strong>vectors</strong> — mathematical structures that represent information in multiple dimensions. Unlike traditional databases that rely on exact matching, vector databases enable <strong>similarity searches</strong>, which are ideal for retrieving content like texts, images or sounds based on their characteristics.</p>
<p>This brings us to a key question: <em>what is a vector?</em></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-a-vector">What Is a Vector?<a href="https://blog.tchez.dev/vector-database/#what-is-a-vector" class="hash-link" aria-label="Direct link to What Is a Vector?" title="Direct link to What Is a Vector?" translate="no">​</a></h2>
<p>A <strong>vector</strong> is a structure that stores information across multiple dimensions. In the case of a three-dimensional vector, it has three coordinates — <em>(x, y, z)</em> — that define its position or direction in a 3-D space.</p>
<p>A real-world example is how colors are represented in the <a href="https://en.wikipedia.org/wiki/RGB" target="_blank" rel="noopener noreferrer"><strong>RGB</strong></a> model (Red, Green, Blue). A color is described by three values, each representing the intensity of red, green and blue. For instance, white is <code>[255, 255, 255]</code>, while black is <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+Kfnua3t/LIy8m/rKXNzMrV5a6rqKKjo7W2tgDooqLs3Nvu//71v8S5o4Z2uLe+0Ov89/Ls7+/z9PV25y7myYEIvAAAAABJRU5ErkJggg==&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="/assets/ideal-img/image-1.a0a591f.640.png" srcset="/assets/ideal-img/image-1.a0a591f.640.png 640w,/assets/ideal-img/image-1.316bccb.920.png 920w,/assets/ideal-img/image-1.6e13899.1166.png 1166w" width="640" height="138"></noscript></div>
<br>
<p>This concept extends to <strong>4-D vectors</strong>, such as <a href="https://en.wikipedia.org/wiki/RGBA" target="_blank" rel="noopener noreferrer"><strong>RGBA</strong></a>, where the fourth component “A” stands for <strong>alpha</strong> (transparência). A semi-transparent red 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,iVBORw0KGgoAAAANSUhEUgAAAAoAAAACCAIAAADuA9qHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAPUlEQVR4nCXJsQkAIAwEQPefJZ0rmNZBlEQEDQjRF/TaCzgHwDabRDWlwjxy3mvhCb/drMTYRLR3UXX33xe4jzgPRe0gRwAAAABJRU5ErkJggg==&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="/assets/ideal-img/image-2.cbd12ec.640.png" srcset="/assets/ideal-img/image-2.cbd12ec.640.png 640w,/assets/ideal-img/image-2.b86d4c7.920.png 920w,/assets/ideal-img/image-2.723364a.1166.png 1166w" width="640" height="138"></noscript></div>
<br>
<p>Just as colors can be represented by vectors in three or four dimensions, vector databases use vectors to organize items such as words, images and sounds in multidimensional spaces, where the <strong>distance</strong> between vectors indicates similarity.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="representing-words-with-vectors">Representing Words with Vectors<a href="https://blog.tchez.dev/vector-database/#representing-words-with-vectors" class="hash-link" aria-label="Direct link to Representing Words with Vectors" title="Direct link to Representing Words with Vectors" translate="no">​</a></h3>
<p>Vectors are widely used to represent more abstract information, such as words. In NLP, converting words into numbers is essential for machines to understand and manipulate them. One of the simplest techniques is <strong>One-Hot Encoding</strong>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="one-hot-encoding">One-Hot Encoding<a href="https://blog.tchez.dev/vector-database/#one-hot-encoding" class="hash-link" aria-label="Direct link to One-Hot Encoding" title="Direct link to One-Hot Encoding" translate="no">​</a></h3>
<p>One-Hot Encoding is a technique in which each word is transformed into a vector of zeros and ones. In this vector, each position corresponds to a specific word in the vocabulary, and only one position holds the value "1" — all the others are set to "0".</p>
<p>Let’s consider a set of four words: dog, cat, bird, and fish. Using One-Hot Encoding, these words would be represented as follows:</p>
<ul>
<li><strong>dog:</strong> [1, 0, 0, 0]</li>
<li><strong>cat:</strong> [0, 1, 0, 0]</li>
<li><strong>bird:</strong> [0, 0, 1, 0]</li>
<li><strong>fish:</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/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAgUlEQVR4nBXJwQrCMAwA0P3/t3kYgoIw8CCCk7XN2iZNmiYV3/Ut7m7TAAAR55zuzsIhBjPz6QuNdonrmc8EiYiGjGu4b/GJuerQxdxab5Cg5qqqZlYJY4oq6u6LmUmT1/Fej1sX6b2XWiHBI2+hp38TUqbyKTszqyoiMvNevm20H26ujyFlBfBYAAAAAElFTkSuQmCC&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="/assets/ideal-img/image-3.02a0310.640.png" srcset="/assets/ideal-img/image-3.02a0310.640.png 640w,/assets/ideal-img/image-3.bde488d.920.png 920w,/assets/ideal-img/image-3.e2d4b9e.1166.png 1166w" width="640" height="299"></noscript></div>
<br>
<p>Each vector contains only one "1", indicating the corresponding word, while the "0s" indicate that the other words are not present. Although this approach is simple and easy to implement, it comes with some limitations — especially as the vocabulary begins to grow.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-limitations-of-one-hot-encoding">The Limitations of One-Hot Encoding<a href="https://blog.tchez.dev/vector-database/#the-limitations-of-one-hot-encoding" class="hash-link" aria-label="Direct link to The Limitations of One-Hot Encoding" title="Direct link to The Limitations of One-Hot Encoding" translate="no">​</a></h3>
<p>Although simple, One-Hot Encoding doesn't capture semantic relationships between words. In the example above, "dog" and "cat" are treated as completely different, even though both are household pets, have four legs, two ears, and a tail. Another drawback appears in scenarios with large vocabularies — say, 10,000 words. In such cases, each word would be represented by a very long vector with a single "1" among 10,000 positions, offering no indication of how the words relate to one another. This inefficiency and lack of semantic information highlight the need for more advanced techniques to represent words as vectors in a meaningful way.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="advanced-representations-embeddings">Advanced Representations: Embeddings<a href="https://blog.tchez.dev/vector-database/#advanced-representations-embeddings" class="hash-link" aria-label="Direct link to Advanced Representations: Embeddings" title="Direct link to Advanced Representations: Embeddings" translate="no">​</a></h3>
<p>To overcome these limitations, embeddings were introduced — dense and continuous vector representations of words, where words with similar meanings are placed close to each other in the vector space. Unlike One-Hot Encoding, embeddings capture the meaning of words, positioning related terms — like “dog” and “cat” — near each other in the vector space, since they share common features.</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAFCAIAAADzBuo/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAaElEQVR4nFWLyxZAMAwF/f8H2tkhqUdSVaTViuOx4C5mMXNuofdSVgk7NNATS4hpT48vLhwHS0YOUBmoqS1rQnv7TzainWjvMzYT0/J5q45OWpzNqsYlHIS2/MveC3WTi2p5JeAlvvkExmWQorFXoaQAAAAASUVORK5CYII=&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="/assets/ideal-img/image-4.5fd7ba1.640.png" srcset="/assets/ideal-img/image-4.5fd7ba1.640.png 640w,/assets/ideal-img/image-4.076f616.920.png 920w,/assets/ideal-img/image-4.06a6dae.1166.png 1166w" width="640" height="299"></noscript></div>
<br>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-embeddings">What Are Embeddings?<a href="https://blog.tchez.dev/vector-database/#what-are-embeddings" class="hash-link" aria-label="Direct link to What Are Embeddings?" title="Direct link to What Are Embeddings?" translate="no">​</a></h2>
<p>Embeddings are a way to represent data as vectors, where similar items are positioned close to one another in a multidimensional space. They are widely used in areas like NLP to capture relationships between words, images, or sounds more effectively than simpler methods like One-Hot Encoding.</p>
<p>These embeddings allow data with similar characteristics to cluster together, which makes similarity search and grouping of related information much more efficient.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="a-simple-analogy-colors-in-a-3-d-vector-space">A Simple Analogy: Colors in a 3-D Vector Space<a href="https://blog.tchez.dev/vector-database/#a-simple-analogy-colors-in-a-3-d-vector-space" class="hash-link" aria-label="Direct link to A Simple Analogy: Colors in a 3-D Vector Space" title="Direct link to A Simple Analogy: Colors in a 3-D Vector Space" translate="no">​</a></h3>
<p>To make this easier to understand, let’s consider a familiar example: colors in the <strong>RGBA</strong> model. Each color is represented by four values — the intensities of red, green, and blue, plus an alpha channel that controls transparency — placing it in a <strong>four-dimensional (4D)</strong> space.</p>
<blockquote>
<p>Since we can’t visualize four dimensions directly, we simplify by plotting just the RGB components in a 3D space. The alpha value still exists, but isn't represented visually in this view.</p>
</blockquote>
<p>For example:</p>
<ul>
<li><strong>Red:</strong> <code>[255, 0, 0, 1]</code></li>
<li><strong>Light Red:</strong> <code>[255, 0, 0, 0.5]</code></li>
<li><strong>Green:</strong> <code>[0, 255, 0, 1]</code></li>
<li><strong>Blue:</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/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAASklEQVR4nF3KMQ7AIAxDUe5/WsRAXYzjKtChJUsk/1dsO8L2aK3XOqVYl7td9ksDBDDQAZA8cwqHQt/llzfh1NSLMt9Uv0COk9oP44yUeVZQC3UAAAAASUVORK5CYII=&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="/assets/ideal-img/image-5.08e44fa.640.png" srcset="/assets/ideal-img/image-5.08e44fa.640.png 640w,/assets/ideal-img/image-5.0764659.920.png 920w,/assets/ideal-img/image-5.b57270c.1166.png 1166w" width="640" height="299"></noscript></div>
<br>
<p>When we plot these colors in a 3D space using only the RGB components, we can clearly see that <strong>Red</strong> and <strong>Light Red</strong> appear close to each other, while <strong>Green</strong> and <strong>Blue</strong> are located farther away. This spatial proximity reflects how similar the colors are — in this case, due to their shared red intensity.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="representing-words-with-embeddings">Representing Words with Embeddings<a href="https://blog.tchez.dev/vector-database/#representing-words-with-embeddings" class="hash-link" aria-label="Direct link to Representing Words with Embeddings" title="Direct link to Representing Words with Embeddings" translate="no">​</a></h3>
<p>Now, let’s apply this idea to how we represent words. Instead of using three or four dimensions like in the RGB color model, words are typically represented in <strong>vector spaces with hundreds or even thousands of dimensions</strong>. Each dimension captures some aspect or feature of the word — such as its meaning, context, or relationships with other words.</p>
<p>For example:</p>
<div style="background-size:cover;background-repeat:no-repeat;position:relative;background-image:url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAECAIAAAA4WjmaAAAACXBIWXMAAAsTAAALEwEAmpwYAAAARklEQVR4nE2KWw6AIBADuf8dvQDxgXyguNvWkOiG+etMkyboJnE2SRLcAEhyN/Z+52z8TiPzHwTbdrVaw4wc4OG6nPtRIr/Bg3ZVTzVp8AAAAABJRU5ErkJggg==&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="/assets/ideal-img/image-6.172d15a.640.png" srcset="/assets/ideal-img/image-6.172d15a.640.png 640w,/assets/ideal-img/image-6.a33e380.920.png 920w,/assets/ideal-img/image-6.0ebf37a.1166.png 1166w" width="640" height="254"></noscript></div>
<br>
<p>In the example above, <strong>"dog"</strong> and <strong>"cat"</strong> appear close to each other in the vector space, because both are pets and share contextual similarities. On the other hand, <strong>"car"</strong> and <strong>"forest"</strong> are positioned farther away due to their very different meanings and usage patterns.</p>
<blockquote>
<p>Illustrative only — no actual model was used to generate this plot.</p>
</blockquote>
<p>These <strong>high-dimensional vector spaces</strong> are generated by <strong>embedding models</strong>, which analyze large volumes of text and learn to position words based on the contexts in which they appear. The closer two words are in the space, the more semantically similar they are likely to be.</p>
<p>This representation makes it possible for machines to reason about meaning — not just recognize exact matches, but <strong>understand relatedness</strong>. That’s a key foundation for modern AI tasks like question answering, translation, and semantic search.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="explore-a-real-embedding-representation">Explore a Real Embedding Representation<a href="https://blog.tchez.dev/vector-database/#explore-a-real-embedding-representation" class="hash-link" aria-label="Direct link to Explore a Real Embedding Representation" title="Direct link to Explore a Real Embedding Representation" translate="no">​</a></h3>
<p>If you’d like to see what embeddings look like in practice, you can explore a live, interactive visualization using the <a href="https://projector.tensorflow.org/" target="_blank" rel="noopener noreferrer">TensorFlow Embedding Projector</a>. This tool allows you to <strong>navigate through high-dimensional vector spaces</strong> and observe how words, images, or other data points are organized based on their semantic relationships.</p>
<p>You'll see something similar to the example below, where each word is plotted in a space with up to 200 dimensions, reduced visually to 2D or 3D using dimensionality reduction techniques like <a href="https://en.wikipedia.org/wiki/Principal_component_analysis" target="_blank" rel="noopener noreferrer">PCA</a> ou <a href="https://en.wikipedia.org/wiki/T-distributed_stochastic_neighbor_embedding" 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="/assets/ideal-img/image-7.4bb9f52.640.png" srcset="/assets/ideal-img/image-7.4bb9f52.640.png 640w,/assets/ideal-img/image-7.29b8a8c.902.png 902w" width="640" height="393"></noscript></div>
<br>
<p>In this visualization, each dot represents a word, and the proximity between them reflects how similar their meanings are according to the embedding model. For example, the word <strong>“store”</strong> is surrounded by words like <strong>“shop,” “market,”</strong> and <strong>“retail”</strong>, indicating that the model has learned their contextual similarity from large-scale text data.</p>
<blockquote>
<p>This type of embedding space enables machines not only to recognize individual terms, but also to understand relationships between them — a powerful capability for tasks like semantic search, where the goal is to find relevant information based on meaning rather than exact matches.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-vector-db-works">How Does a Vector Database Work?<a href="https://blog.tchez.dev/vector-database/#how-vector-db-works" class="hash-link" aria-label="Direct link to How Does a Vector Database Work?" title="Direct link to How Does a Vector Database Work?" translate="no">​</a></h2>
<p>Now that we’ve covered the basic concepts, we can better understand how <strong>vector databases</strong> operate. A vector database organizes data in the form of vectors, which occupy positions in <strong>multidimensional space</strong>. The main goal is to enable <strong>semantic search</strong> — that is, finding similar items based on their <strong>vector proximity</strong>, rather than exact matches like in traditional databases.</p>
<p>For example, imagine a database of images where each image is represented as a vector that captures its visual characteristics — such as color, shape, and texture. If you want to find images similar to a specific picture of a cat, the vector database will compute the <strong>distance</strong> between the query image's vector and the vectors of other stored images. Those with the <strong>shortest distance</strong> will be returned as results, since they share similar characteristics.</p>
<p>A common real-world application of this is <strong>facial recognition</strong>, where the similarity between the vector of a captured face and that of a registered face can indicate a potential match.</p>
<p>But how exactly is similarity between vectors measured?</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="vector-distance-and-similarity-search">Vector Distance and Similarity Search<a href="https://blog.tchez.dev/vector-database/#vector-distance-and-similarity-search" class="hash-link" aria-label="Direct link to Vector Distance and Similarity Search" title="Direct link to Vector Distance and Similarity Search" translate="no">​</a></h3>
<p>In a vector database, items with similar features are clustered close to each other in a <strong>multidimensional space</strong>. The "closeness" — or <strong>similarity</strong> — between items is determined by specific <strong>distance metrics</strong>, such as <a href="https://en.wikipedia.org/wiki/Euclidean_distance" target="_blank" rel="noopener noreferrer"><strong>Euclidean distance</strong></a> or <a href="https://en.wikipedia.org/wiki/Cosine_similarity" target="_blank" rel="noopener noreferrer"><strong>cosine similarity</strong></a>.</p>
<p>In the case of word searches, like in our earlier embeddings example, a vector database can return words that are semantically close to the query. For instance, if you search for the word <strong>"feline"</strong>, the database might return <strong>"cat," "tiger,"</strong> or <strong>"leopard"</strong>, based on how near their vectors are in the semantic space.</p>
<blockquote>
<p>This kind of vector-based matching allows systems to go beyond surface-level keywords and find results that are <strong>meaningfully related</strong>, even when the exact words don’t match — a major advantage in modern AI applications.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="applications-of-vector-databases">Applications of Vector Databases<a href="https://blog.tchez.dev/vector-database/#applications-of-vector-databases" class="hash-link" aria-label="Direct link to Applications of Vector Databases" title="Direct link to Applications of Vector Databases" translate="no">​</a></h2>
<p>Vector databases are already being widely used to solve challenges related to <strong>unstructured data</strong> across various domains. Here are some practical examples:</p>
<ul>
<li>
<p><strong>Image Search</strong>: Medical systems and platforms like Google Images use vector databases to find visually similar images based on features like color, shape, and texture — which helps with diagnoses and content discovery.</p>
</li>
<li>
<p><strong>Product Recommendations</strong>: In e-commerce, vector databases suggest products based on past searches or user purchase history, enabling a more personalized shopping experience.</p>
</li>
<li>
<p><strong>Facial Recognition</strong>: Security systems use vector databases to compare facial images, identifying matches with high precision — making authentication and surveillance more effective.</p>
</li>
<li>
<p><a href="https://en.wikipedia.org/wiki/Retrieval-Augmented_Generation" target="_blank" rel="noopener noreferrer"><strong>RAG (Retrieval-Augmented Generation)</strong></a>: This technique combines document retrieval from vector databases with the response generation capabilities of large language models (LLMs). It allows these models to specialize in specific topics without requiring retraining.</p>
</li>
</ul>
<blockquote>
<p><em>In my <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">undergraduate thesis</a>, I used RAG to build a chatbot focused on mental health. The system retrieves relevant information and provides more accurate and contextualized responses.</em></p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://blog.tchez.dev/vector-database/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>As unstructured data continues to grow exponentially, <strong>vector databases are becoming essential for retrieving information efficiently and meaningfully</strong>. By enabling <strong>similarity-based search</strong> rather than relying on exact matches, they open up new possibilities for interacting with complex data in more intuitive and intelligent ways.</p>
<p>From applications like <strong>image search</strong>, <strong>product recommendations</strong>, and <strong>facial recognition</strong>, to powering advanced techniques such as <strong>RAG</strong>, vector databases are poised to play a foundational role in the future of artificial intelligence. They help bridge the gap between raw data and actionable knowledge — fueling innovation across industries.</p>
<p>In a world where context and meaning matter more than ever, vector databases offer a paradigm shift. By interpreting data <strong>semantically</strong>, they have the potential to <strong>revolutionize the way we store, retrieve, and understand information</strong> — connecting today’s digital systems with the knowledge-driven technologies of tomorrow.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://blog.tchez.dev/vector-database/#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" 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[Do you know what magic methods are in Python? Hint: You use them every day!]]></title>
            <link>https://blog.tchez.dev/dunder-methods/</link>
            <guid>https://blog.tchez.dev/dunder-methods/</guid>
            <pubDate>Wed, 11 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In this article, we will explore the fascinating world of magic methods in Python, their purpose, and how they can enhance your coding experience. Let's dive in!]]></description>
            <content:encoded><![CDATA[<blockquote>
<p>This article was originally published on <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/assets/images/article-og-8dfb080971478ddeca220d443fe31cca.png" width="1260" height="720" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="do-you-know-what-magic-methods-are-in-python-hint-you-use-them-every-day">Do you know what magic methods are in Python? Hint: You use them every day!<a href="https://blog.tchez.dev/dunder-methods/#do-you-know-what-magic-methods-are-in-python-hint-you-use-them-every-day" class="hash-link" aria-label="Direct link to Do you know what magic methods are in Python? Hint: You use them every day!" title="Direct link to Do you know what magic methods are in Python? Hint: You use them every day!" translate="no">​</a></h2>
<p>A few years ago, when I was learning to use the Django framework (the first framework I ever learned), I came across a peculiar characteristic of Python classes: the constructor method has to follow a specific pattern — it must be identified by double underscores (__) before and after the word <code>init</code>. That struck me as odd; why this specific structure?</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">MyClass</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)"># This is the constructor method</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>Trying to understand where these 'different' functions came from, I found out that in the world of Python, there are several methods that follow this 'dunder' pattern (a nickname derived from Double UNDERscore). These methods aren’t just common — they’re special and fundamental to the language, known as dunder methods or magic methods.</p>
<p>OK, but what do these methods actually do? What makes them 'magic'?</p>
<p>Those were some of the questions that led me to study them more deeply and write this article. Hope you enjoy it :)</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-dunder-methods">What are dunder methods?<a href="https://blog.tchez.dev/dunder-methods/#what-are-dunder-methods" class="hash-link" aria-label="Direct link to What are dunder methods?" title="Direct link to What are dunder methods?" translate="no">​</a></h2>
<p>In the world of programming, we often come across concepts that seem complex at first, but once understood, make perfect sense. A great example of this in Python is <em>dunder methods</em>.</p>
<p>So, what exactly are these methods? As mentioned earlier, the word 'dunder' refers to the double underscore notation at the beginning and end of the names of these special methods. For instance, <code>__init__</code> for a class constructor, or <code>__str__</code> for the string representation of an object.</p>
<blockquote>
<p>P.S. Some Python purists don’t like calling the <code>__init__</code> method a constructor, since technically it’s an initializer. However, for the sake of simplicity, we’ll refer to it as a constructor throughout this article.</p>
</blockquote>
<p>These methods aren’t called directly by name. Instead, Python calls them internally when certain actions are performed. For example, when we add two objects using the <code>+</code> operator, Python internally calls the <code>__add__</code> method, which handles the logic of adding one value to another.</p>
<blockquote>
<p>Still a bit confusing? Let me give you some examples to make it clearer!</p>
</blockquote>
<p>Imagine you're building a class to represent a book in a library. To do that, you’ll need to implement the <code>__init__</code> method, which acts as a constructor, setting up initial attributes like title, author, and page count:</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">Book</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"> title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pages</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">title </span><span class="token operator">=</span><span class="token plain"> title</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">author </span><span class="token operator">=</span><span class="token plain"> author</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">pages </span><span class="token operator">=</span><span class="token plain"> pages</span><br></span></code></pre></div></div>
<p>What happens when you try to add two <code>Book</code> objects together? You might expect them to combine in some way, but Python doesn't know how to handle that operation by default:</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">book1 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"First Book"</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)">"Author 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">book2 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Second Book"</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)">"Author 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">book1 </span><span class="token operator">+</span><span class="token plain"> book2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>This will raise a <code>TypeError</code> because Python doesn't know how to add two <code>Book</code> objects together. This code will output:</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)">'Book'</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)">'Book'</span><br></span></code></pre></div></div>
<p>To make this operation work, you can define the <code>__add__</code> method in your <code>Book</code> class. This method will specify how two <code>Book</code> objects should be added together. For example, you might want to add their page counts:</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">Book</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"> title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pages</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">title </span><span class="token operator">=</span><span class="token plain"> title</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">author </span><span class="token operator">=</span><span class="token plain"> author</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">pages </span><span class="token operator">=</span><span class="token plain"> pages</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">pages </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">pages</span><br></span></code></pre></div></div>
<p>Now, when you try to add two <code>Book</code> objects, Python will call the <code>__add__</code> method, in this case, summing their page counts. This is how you can customize the behavior of operators for your own 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">book1 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"First Book"</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)">"Author 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">book2 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Second Book"</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)">"Author 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">book1 </span><span class="token operator">+</span><span class="token plain"> book2</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)"># This will output: 300</span><br></span></code></pre></div></div>
<p><strong>This behavior isn't limited to just the addition operator!</strong></p>
<p>Actually, the most operators in Python can be customized using dunder methods. For example, you can define how your class behaves with the <code>==</code> operator by implementing the <code>__eq__</code> method, or with the <code>-</code> operator by implementing the <code>__sub__</code> method. A good example of this is the <code>in</code> operator, when we verify if some <code>value</code> is <code>in</code> a <code>list</code>, behind the scenes, Python is calling the <code>__contains__</code> method of the list class, passing the <code>value</code> as an argument. See the example below:</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">my_list </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"> my_list</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)"># This will output: 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">my_list</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)"># This will also output: 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"> my_list</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)"># This will output: 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">my_list</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)"># This will also output: False</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="more-examples-of-dunder-methods">More examples of dunder methods<a href="https://blog.tchez.dev/dunder-methods/#more-examples-of-dunder-methods" class="hash-link" aria-label="Direct link to More examples of dunder methods" title="Direct link to More examples of dunder methods" translate="no">​</a></h2>
<p>Now that you have a basic understanding of what dunder methods are and how they work, let's see some more examples of their usage, still applied to the <code>Book</code> class:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="__str__-customizing-prints"><code>__str__</code>: Customizing prints<a href="https://blog.tchez.dev/dunder-methods/#__str__-customizing-prints" class="hash-link" aria-label="Direct link to __str__-customizing-prints" title="Direct link to __str__-customizing-prints" translate="no">​</a></h3>
<p>Following the previous example, what happens when you try to print a <code>Book</code> object? By default, Python will show something like <code>&lt;__main__.Book object at 0x...&gt;</code>, which isn't very informative:</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">book1 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"First Book"</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)">"Author 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">book1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>This will output something like:</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>If you're wondering whether it's possible to customize this output, making the representation more user-friendly, yes, it is! You just need to implement the magic method called <code>__str__</code> in your class. This method allows you to define how your object should be represented as a <em>string</em>. So, let's go ahead and implement it:</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">Book</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"> title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pages</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">title </span><span class="token operator">=</span><span class="token plain"> title</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">author </span><span class="token operator">=</span><span class="token plain"> author</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">pages </span><span class="token operator">=</span><span class="token plain"> pages</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">title</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)"> by </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">author</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">pages</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)"> pages"</span><br></span></code></pre></div></div>
<p>Now, when you print a <code>Book</code> object, it will display the title, author, and page count in a more readable format:</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">book1 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"First Book"</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)">"Author 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">book1</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)"># This will output: First Book by Author A, 100 pages</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="__eq__-customizing-equality-checks"><code>__eq__</code>: Customizing equality checks<a href="https://blog.tchez.dev/dunder-methods/#__eq__-customizing-equality-checks" class="hash-link" aria-label="Direct link to __eq__-customizing-equality-checks" title="Direct link to __eq__-customizing-equality-checks" translate="no">​</a></h3>
<p>What if you want to check if two <code>Book</code> objects are considered equal? By default, Python checks if they are the same object in memory, which might not be what you want. To customize this behavior, you can implement the <code>__eq__</code> method:</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">Book</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"> title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pages</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">title </span><span class="token operator">=</span><span class="token plain"> title</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">author </span><span class="token operator">=</span><span class="token plain"> author</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">pages </span><span class="token operator">=</span><span class="token plain"> pages</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">title </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">title </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">author </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">author </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">pages </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">pages</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Now, you can compare two <code>Book</code> objects for equality based on their attributes:</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">book1 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"First Book"</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)">"Author 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">book2 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Second Book"</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)">"Author 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">book3 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"First Book"</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)">"Author 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">book1 </span><span class="token operator">==</span><span class="token plain"> book2</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)"># This will output: 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">book1 </span><span class="token operator">==</span><span class="token plain"> book3</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)"># This will output: 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">book3</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">book1</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)"># This will output: True</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="__len__-customizing-length-checks"><code>__len__</code>: Customizing length checks<a href="https://blog.tchez.dev/dunder-methods/#__len__-customizing-length-checks" class="hash-link" aria-label="Direct link to __len__-customizing-length-checks" title="Direct link to __len__-customizing-length-checks" translate="no">​</a></h3>
<p>What if you want to check how many pages a book has? You can manually check the <code>pages</code> attribute, but you can also implement the <code>__len__</code> method to allow the use of the built-in <code>len()</code> function:</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">Book</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"> title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pages</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">title </span><span class="token operator">=</span><span class="token plain"> title</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">author </span><span class="token operator">=</span><span class="token plain"> author</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">pages </span><span class="token operator">=</span><span class="token plain"> pages</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">pages</span><br></span></code></pre></div></div>
<p>Now, you can use the <code>len()</code> function on a <code>Book</code> object:</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">book1 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"First Book"</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)">"Author 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">book1</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)"># This will output: 100</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="__getitem__-customizing-item-access"><code>__getitem__</code>: Customizing item access<a href="https://blog.tchez.dev/dunder-methods/#__getitem__-customizing-item-access" class="hash-link" aria-label="Direct link to __getitem__-customizing-item-access" title="Direct link to __getitem__-customizing-item-access" translate="no">​</a></h3>
<p>Lastly, what if you want to access a specific attribute of a <code>Book</code> object using indexing, like <code>book[0]</code> for the title? You can implement the <code>__getitem__</code> method:</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">Book</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"> title</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> author</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> pages</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">title </span><span class="token operator">=</span><span class="token plain"> title</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">author </span><span class="token operator">=</span><span class="token plain"> author</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">pages </span><span class="token operator">=</span><span class="token plain"> pages</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">title</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">author</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">pages</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)">"Index out of range"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Now, you can access the title, author, and pages of a <code>Book</code> object using indexing:</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">book1 </span><span class="token operator">=</span><span class="token plain"> Book</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"First Book"</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)">"Author 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">book1</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)"># This will output: First Book</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">book1</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)"># This will output: Author 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">book1</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)"># This will output: 100</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://blog.tchez.dev/dunder-methods/#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>These were just a few examples that highlight the power and flexibility of dunder methods in Python. With them, you can shape the behavior of your classes and objects in ways that align with the language's syntax and paradigms, making your code more intuitive and 'Pythonic'.</p>
<p>So, next time you're designing a Python class, remember the magic of dunder methods and how they can enrich your abstractions!</p>
<p>Bellow, I'll leave a list of some of the most commonly used dunder methods in Python, each linked to the official documentation for further reading:</p>
<ul>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__init__" target="_blank" rel="noopener noreferrer"><code>__init__</code></a>: The constructor method, called when an object is created.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__add__" target="_blank" rel="noopener noreferrer"><code>__add__</code></a>: Defines the behavior of the addition operator (<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>: Defines the behavior of the <code>in</code> operator for an object.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__str__" target="_blank" rel="noopener noreferrer"><code>__str__</code></a>: Defines the string representation of an object, used by the <code>print()</code> function.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__eq__" target="_blank" rel="noopener noreferrer"><code>__eq__</code></a>: Defines the behavior of the equality operator (<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>: Defines the behavior of the <code>len()</code> function for an object.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__getitem__" target="_blank" rel="noopener noreferrer"><code>__getitem__</code></a>: Defines the behavior of indexing an object (e.g., <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>: Defines the behavior of setting an item in an object (e.g., <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>: Defines the behavior of deleting an item from an object (e.g., <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>: Defines the official string representation of an object, used by the <code>repr()</code> function.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__ne__" target="_blank" rel="noopener noreferrer"><code>__ne__</code></a>: Defines the behavior of the inequality operator (<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>: Defines the behavior of the less than operator (<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>: Defines the behavior of the less than or equal to operator (<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>: Defines the behavior of the greater than operator (<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>: Defines the behavior of the greater than or equal to operator (<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>: Defines the behavior of the subtraction operator (<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>: Defines the behavior of the multiplication operator (<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>: Defines the behavior of the true division operator (<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>: Defines the truth value of an object, used by the <code>bool()</code> function.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__iter__" target="_blank" rel="noopener noreferrer"><code>__iter__</code></a>: Defines the behavior of an object when used in a loop or with the <code>iter()</code> function.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__next__" target="_blank" rel="noopener noreferrer"><code>__next__</code></a>: Defines the behavior of the <code>next()</code> function for an object, allowing it to be iterable.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__enter__" target="_blank" rel="noopener noreferrer"><code>__enter__</code></a>: Defines the behavior of an object when used in a <code>with</code> statement, allowing it to set up a context.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__exit__" target="_blank" rel="noopener noreferrer"><code>__exit__</code></a>: Defines the behavior of an object when exiting a <code>with</code> statement, allowing it to clean up resources.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__hash__" target="_blank" rel="noopener noreferrer"><code>__hash__</code></a>: Defines the behavior of the <code>hash()</code> function for an object, allowing it to be used in hash-based collections like sets and dictionaries.</li>
<li><a href="https://docs.python.org/3/reference/datamodel.html#object.__del__" target="_blank" rel="noopener noreferrer"><code>__del__</code></a>: Defines the behavior of an object when it is about to be destroyed, allowing for cleanup actions.</li>
</ul>
<p>I hope this article has shed some light on the fascinating world of dunder methods in Python. If you have any questions or want to share your experiences with dunder methods, feel free to get in touch! Happy coding!</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="references">References<a href="https://blog.tchez.dev/dunder-methods/#references" class="hash-link" aria-label="Direct link to References" title="Direct link to References" 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>programming</category>
            <category>article</category>
        </item>
        <item>
            <title><![CDATA[Welcome to Brain Blog 🎉]]></title>
            <link>https://blog.tchez.dev/welcome/</link>
            <guid>https://blog.tchez.dev/welcome/</guid>
            <pubDate>Sun, 04 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[My personal place to share ideas and dump structured knowledge.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="Brain&nbsp;Blog" src="https://blog.tchez.dev/assets/images/logo-og-2f341927a68b033b11836f1447dc586f.png" width="1200" height="630" class="img_ev3q"></p>
<p>Hello, world! 👋</p>
<p>I’m <strong><a href="https://www.linkedin.com/in/tchez" target="_blank" rel="noopener noreferrer">Marco&nbsp;Antônio</a></strong> and this is my <strong>Brain&nbsp;Blog</strong>.</p>
<p>This first post is a quick tour of what you’ll find here.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-brainblog">Why “Brain&nbsp;Blog”?<a href="https://blog.tchez.dev/welcome/#why-brainblog" class="hash-link" aria-label="Direct link to Why “Brain&nbsp;Blog”?" title="Direct link to Why “Brain&nbsp;Blog”?" translate="no">​</a></h3>
<blockquote>
<p><em>“Those who teach learn while teaching, and those who learn teach while learning.”</em>
— Paulo Freire (Translated from Portuguese)</p>
</blockquote>
<p>Brain&nbsp;Blog is a public backup of my brain where I capture study notes,
organize references and document learning journeys.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="content-structure">Content structure<a href="https://blog.tchez.dev/welcome/#content-structure" class="hash-link" aria-label="Direct link to Content structure" title="Direct link to Content structure" translate="no">​</a></h3>
<blockquote>
<p>My personal stream of ideas and experience.</p>
</blockquote>
<p>You’ll read articles, tutorials and reflections on topics that excite me,
plus lessons learned from real‑world projects.</p>]]></content:encoded>
            <category>blog</category>
        </item>
    </channel>
</rss>