<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Vafa</title>
    <description>The latest articles on Forem by Vafa (@pipinstalled).</description>
    <link>https://forem.com/pipinstalled</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3543184%2F3d3470ba-be80-4e34-ac1e-c485c006d05b.png</url>
      <title>Forem: Vafa</title>
      <link>https://forem.com/pipinstalled</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pipinstalled"/>
    <language>en</language>
    <item>
      <title>معرفی متاکلاس‌ها در پایتون</title>
      <dc:creator>Vafa</dc:creator>
      <pubDate>Wed, 26 Nov 2025 20:10:50 +0000</pubDate>
      <link>https://forem.com/pipinstalled/mrfy-mtkhlsh-dr-pytwn-3a34</link>
      <guid>https://forem.com/pipinstalled/mrfy-mtkhlsh-dr-pytwn-3a34</guid>
      <description>&lt;p&gt;متاکلاس‌ها از اون چیزهایی هستن که اسمشون ترسناک به‌نظر میاد، ولی واقعاً ساده تر از چیزی هستن که فکر میکنیم&lt;/p&gt;

&lt;p&gt;کلاس‌ها شیء می‌سازن&lt;/p&gt;

&lt;p&gt;متاکلاس‌ها خودشون کلاس می‌سازن&lt;/p&gt;

&lt;p&gt;مثلاً وقتی می‌نویسی:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class User:
    pass

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;این کلاس User خودش یه شیء حساب می‌شه. پایتون هم برای ساختنش از یه چیزی به اسم متاکلاس استفاده می‌کنه.&lt;br&gt;
به‌طور پیش‌فرض هم از type استفاده می‌کنه:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;print(type(User))

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;که نتیجه‌ش:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;class 'type'&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;پس type در واقع سازندهٔ کلاس‌هاست.&lt;/p&gt;

&lt;p&gt;اصلاً چرا باید از متاکلاس استفاده کنیم؟&lt;/p&gt;

&lt;p&gt;واقعیت اینه که، ۹۹٪ برنامه‌نویس‌ها هیچ‌وقت از متاکلاس استفاده نمی‌کنن — و مشکلی هم نیست.&lt;/p&gt;

&lt;p&gt;ولی فریم‌ورک‌های معروف مثل Django و SQLAlchemy و Pydantic ازش استفاده می‌کنن برای:&lt;/p&gt;

&lt;p&gt;اضافه‌کردن یه سری ویژگی اضافه به کلاس‌ها&lt;/p&gt;

&lt;p&gt;تغییر دادن یا چک کردن کلاس‌ها موقع ساخته شدن&lt;/p&gt;

&lt;p&gt;ثبت خودکار زیرکلاس‌ها&lt;/p&gt;

&lt;p&gt;کمتر کردن کدهای تکراری&lt;/p&gt;

&lt;p&gt;متاکلاس بهت اجازه می‌ده قبل از اینکه کلاس ساخته بشه توی روند ساختنش دخالت کنی.&lt;/p&gt;

&lt;p&gt;یک مثال خیلی ساده&lt;/p&gt;

&lt;p&gt;این متاکلاس اسم هر کلاسی رو که ساخته می‌شه چاپ می‌کنه:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class LoggerMeta(type):
    def __new__(cls, name, bases, attrs):
        print("Creating:", name)
        return super().__new__(cls, name, bases, attrs)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استفاده:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Example(metaclass=LoggerMeta):
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;وقتی فایل اجرا می‌شه، اینو چاپ می‌کنه:&lt;/p&gt;

&lt;p&gt;Creating: Example&lt;/p&gt;

&lt;p&gt;چون متاکلاس قبل از خود کلاس اجرا می‌شه.&lt;/p&gt;

&lt;p&gt;اضافه کردن ویژگی به صورت خودکار&lt;/p&gt;

&lt;p&gt;یه نمونه کاربردی‌تر:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class InfoMeta(type):
    def __new__(cls, name, bases, attrs):
        attrs["source"] = "auto"
        return super().__new__(cls, name, bases, attrs)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;استفاده:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Product(metaclass=InfoMeta):
    pass

print(Product.source)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;خروجی:&lt;/p&gt;

&lt;p&gt;auto&lt;/p&gt;

&lt;p&gt;کی باید سراغ متاکلاس بریم؟&lt;/p&gt;

&lt;p&gt;اگه داری یه برنامه معمولی می‌نویسی، تقریباً هیچ‌وقت!&lt;/p&gt;

&lt;p&gt;متاکلاس‌ها بیشتر برای وقتی‌ان که می‌خوای نحوه ساخته شدن کلاس‌ها رو کنترل کنی — معمولاً توی ساخت فریم‌ورک‌ها، کتابخونه‌ها یا ابزارهای سطح بالا.&lt;/p&gt;

</description>
      <category>python</category>
      <category>softwareengineering</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Introduction to Python Metaclasses</title>
      <dc:creator>Vafa</dc:creator>
      <pubDate>Fri, 21 Nov 2025 08:10:07 +0000</pubDate>
      <link>https://forem.com/pipinstalled/introduction-to-python-metaclasses-5811</link>
      <guid>https://forem.com/pipinstalled/introduction-to-python-metaclasses-5811</guid>
      <description>&lt;p&gt;Metaclasses are one of those Python features that sound complicated but are actually based on a simple idea:&lt;/p&gt;

&lt;p&gt;Classes create objects.&lt;br&gt;
Metaclasses create classes.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;When you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class User:
    pass

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the class User is actually an object, and Python needs something to build that object.&lt;br&gt;
By default, Python uses the metaclass called type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;print(type(User))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;class 'type'&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So type is the “class-maker.”&lt;/p&gt;

&lt;p&gt;Why Would You Ever Use a Metaclass?&lt;/p&gt;

&lt;p&gt;Most people never do — and that’s fine.&lt;/p&gt;

&lt;p&gt;But frameworks like Django, SQLAlchemy, and Pydantic use metaclasses to:&lt;/p&gt;

&lt;p&gt;add extra attributes to classes&lt;/p&gt;

&lt;p&gt;validate or modify classes at creation time&lt;/p&gt;

&lt;p&gt;automatically register subclasses&lt;/p&gt;

&lt;p&gt;build features with less boilerplate&lt;/p&gt;

&lt;p&gt;A metaclass lets you run logic when the class is created, not when it runs.&lt;/p&gt;

&lt;p&gt;A Basic Metaclass Example&lt;/p&gt;

&lt;p&gt;This metaclass prints the name of the class being created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class LoggerMeta(type):
    def __new__(cls, name, bases, attrs):
        print("Creating:", name)
        return super().__new__(cls, name, bases, attrs)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Example(metaclass=LoggerMeta):
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the file loads, it prints:&lt;/p&gt;

&lt;p&gt;Creating: Example&lt;/p&gt;

&lt;p&gt;Because the metaclass runs before the class exists.&lt;/p&gt;

&lt;p&gt;Adding Automatic Attributes&lt;/p&gt;

&lt;p&gt;A more practical example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class InfoMeta(type):
    def __new__(cls, name, bases, attrs):
        attrs["source"] = "auto"
        return super().__new__(cls, name, bases, attrs)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Product(metaclass=InfoMeta):
    pass

print(Product.source)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;auto&lt;/p&gt;

&lt;p&gt;The metaclass quietly added the attribute.&lt;/p&gt;

&lt;p&gt;When to Use Metaclasses&lt;/p&gt;

&lt;p&gt;Use them only when you need to control how classes are built — usually in libraries or frameworks.&lt;/p&gt;

&lt;p&gt;Normal applications almost never need them.&lt;/p&gt;

</description>
      <category>python</category>
      <category>softwareengineering</category>
      <category>metaclass</category>
      <category>backend</category>
    </item>
    <item>
      <title>OOP and SOLID in python</title>
      <dc:creator>Vafa</dc:creator>
      <pubDate>Fri, 03 Oct 2025 04:07:34 +0000</pubDate>
      <link>https://forem.com/pipinstalled/oop-and-solid-in-python-22d8</link>
      <guid>https://forem.com/pipinstalled/oop-and-solid-in-python-22d8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50hekrnz1x8ljioe4sj2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50hekrnz1x8ljioe4sj2.png" alt=" " width="664" height="984"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scenario: A Library's Diverse Collection
&lt;/h2&gt;

&lt;p&gt;Picture a bustling public library where patrons borrow everything from page-turners to quick-watch flicks. To keep things simple yet realistic, we'll focus on three core types of items:&lt;/p&gt;

&lt;p&gt;Book: The classic staple, complete with an author (the storyteller), title (the allure), and pages (the depth of the dive). Borrowing a book should feel like checking out a companion for your next rainy afternoon.&lt;br&gt;
Magazine: Lightweight and current, featuring a title (like "Tech Trends" or "Garden Gazette") and issue number (that fresh-off-the-press vibe). Ideal for a short commute read—nothing too committing.&lt;br&gt;
DVD: For those who prefer stories on screen, with a title (the plot hook) and duration in minutes (how long you'll be glued to the couch). Think family movie nights or indie film marathons.&lt;/p&gt;

&lt;p&gt;The twist? Borrow fees aren't one-size-fits-all, reflecting the library's quirky policy to balance accessibility and revenue:&lt;/p&gt;

&lt;p&gt;Books: 1 unit per 100 pages—encouraging thoughtful borrowing of hefty reads.&lt;br&gt;
Magazines: A flat 2 units—keep the stacks turning over quickly.&lt;br&gt;
DVDs: 0.05 units per minute—fair for varying runtimes, from shorts to sagas.&lt;/p&gt;

&lt;p&gt;This setup screams for OOP: we need polymorphism for those varying fee calculations, inheritance for shared traits (like a title), and encapsulation to bundle each item's logic neatly. But to avoid a tangled mess, SOLID principles guide the way—ensuring our code is robust without becoming rigid.&lt;br&gt;
My Implementation: Building with Abstraction and Polymorphism&lt;br&gt;
I started with an abstract base class (LibraryItem) to define the contract: every item must implement a borrow method that returns its fee. This enforces consistency while letting subclasses shine with their unique logic. Here's the code I came up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;abc&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abstractmethod&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LibraryItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;

    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;borrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LibraryItem&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;borrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Magazine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LibraryItem&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;issue_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;issue_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;issue_number&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;borrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DVD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LibraryItem&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;borrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Library&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;borrow_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;library_item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LibraryItem&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;library_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;total_fee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;total_fee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;total_fee&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;borrow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;borrowed_items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;track_item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;track_item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tracked&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_fee&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;total_fee&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Design? Breaking Down the OOP and SOLID Choices
&lt;/h2&gt;

&lt;p&gt;I leaned on abstract methods because the borrow function is essential for all child classes of LibraryItem, but its implementation varies wildly—polymorphism at its finest. When the Library class iterates over items and calls borrow(), it doesn't care about the type; it just gets the right fee. This is pure magic, making the code flexible and intuitive.&lt;br&gt;
Zooming out, this embodies several SOLID principles:&lt;/p&gt;

&lt;p&gt;Single Responsibility Principle (SRP): Each class has one job. LibraryItem handles the abstract contract, subclasses focus solely on their attributes and fee logic, and Library manages the collection without meddling in calculations.&lt;br&gt;
Open-Closed Principle (OCP): The system is open for extension (add a Comic class? Easy—just inherit and override borrow) but closed for modification (no need to tweak Library or the base class for new types).&lt;br&gt;
Liskov Substitution Principle (LSP): Any LibraryItem subtype can stand in for the parent without breaking things—total_fee works seamlessly with books, magazines, or DVDs.&lt;br&gt;
Interface Segregation Principle (ISP): We're not forcing every item to implement unrelated methods; the abstract interface is slim, just what's needed.&lt;br&gt;
Dependency Inversion Principle (DIP): High-level Library depends on the abstract LibraryItem, not concrete classes, keeping coupling low.&lt;/p&gt;

&lt;p&gt;In short, my sample code supports polymorphism beautifully and is highly extendable. Want to add audiobooks with fees based on listening hours? Subclass away—no ripples in the existing pond.&lt;/p&gt;

&lt;p&gt;If you have any questions, suggestions, or ideas for improving this implementation (or extending it further), I'd love to hear them—feel free to drop a comment below!&lt;/p&gt;

</description>
      <category>python</category>
      <category>backend</category>
      <category>oop</category>
      <category>solidity</category>
    </item>
  </channel>
</rss>
