<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های بهزاد دبیری</title>
        <link>https://virgool.io/feed/@m_62361481</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 13:28:02</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>بهزاد دبیری</title>
            <link>https://virgool.io/@m_62361481</link>
        </image>

                    <item>
                <title>Metaprogramming with Metaclasses in Python</title>
                <link>https://virgool.io/@m_62361481/metaprogramming-with-metaclasses-in-python-oh9oj03808pf</link>
                <description>توی این قسمت قراره بیشتر با Metaprogramming و Metaclas ها اشنا بشیمدر ابتدا، کلمه Metaprogramming شاید یک چیز عجیب و بیگانه به نظر برسه، اما اگر تا به حال با دکوراتورها یا متاکلاس ها کار کرده باشید ، باید بگم که شما در تمام مدت آنجا مشغول فرابرنامه نویسی بودید. به طور خلاصه، میشه گفت فرابرنامه‌نویسی کدی است که کد را دستکاری می‌کنه. اینجا قراره در مورد متاکلاس ها بحث کنیم، چرا و چه زمانی باید از آنها استفاده کنیم و چه جایگزین هایی وجود دارد. این یک مبحث نسبتاً پیشرفته پایتون است و پیش نیاز زیر مورد انتظار است :OOP concept in Pythondecorators in python                                                                      Metaclassesتوی پایتون هرچیزی یک تایپی داره .به عنوان مثال، اگه متغیری داریم که دارای یک مقدار صحیح هست، نوع آن int است. با استفاده از تابع ()type می توانید نوع هر چیزی را بدست آورید.num = 23print(&quot;Type of num is:&quot;, type(num))&gt;&gt;&gt;Type of num is: &lt;class &#039;int&#039;&gt;list = [1, 2, 4]print(&quot;Type of list is:&quot;, type(list))Type of list is: &lt;class &#039;list&#039;&gt;name = &quot;Atul&quot;print(&quot;Type of name is:&quot;, type(name))Type of name is: &lt;class &#039;str&#039;&gt;هر تایپی در پایتون با کلاس تعریف میشه.توی مثال بالا برخلاف ++C یا جاوا که int، char، float انواع داده های اولیه هستند، در پایتون آنها اشیایی از کلاس int یا کلاس str هستند.بنابراین می توانیم با ایجاد کلاسی از آن نوع، یک نوع جدید بسازیم. به عنوان مثال، ما می توانیم با ایجاد یک کلاس Student نوع جدیدی از Student ایجاد کنیم.class Student:	passstu_obj = Student()print(&quot;Type of stu_obj is:&quot;, type(stu_obj))Type of stu_obj is: &lt;class &#039;__main__.Student&#039;&gt;یک کلاس نیز یک شیء است، و درست مانند هر شیء دیگری، نمونه ای از چیزی به نام متاکلاس است. یک  کلاس خاص یا همون(type) این class objects ها را ایجاد می کند. type class یک پیش فرض متاکلاس است که وظیفه ساخت کلاس ها را بر عهده دارد. در مثال بالا، اگر بخواهیم نوع کلاس Student را بفهمیم، خروجی ما type خواهد بود.class Student:	passprint(&quot;Type of Student class is:&quot;, type(Student))Type of Student class is: &lt;class &#039;type&#039;&gt;از آنجا که کلاس ها نیز یک شی هستند، می توان آنها را به همان روش تغییر داد. می‌توانیم فیلدها یا متدها را در کلاس به همان روشی که با اشیاء دیگر انجام دادیم اضافه یا کم کنیم. class test:     passtest.x = 45test.str = lambda self: print(&#x27;Hello&#x27;)my_obj = test()print(my_obj.x)my_obj.str()45
Helloخلاصه مطالب بالا میشه :Object =&gt; instance of ====&gt; Class =&gt; instance of====&gt; Metaclassمتاکلاس مسئول تولید کلاس‌ها است، بنابراین می‌توانیم متاکلاس‌های سفارشی خود را بنویسیم تا نحوه تولید کلاس‌ها را با انجام اقدامات اضافی یا تزریق کد تغییر دهیم.معمولاً ما به متاکلاس های سفارشی نیاز نداریم اما گاهی اوقات لازم است.مشکلاتی وجود دارد که راه‌حل‌های متاکلاس و غیر متاکلاسی برای آنها در دسترس است (که اغلب ساده‌تر هستند) اما در برخی موارد، فقط متاکلاس می‌تواند مشکل را حل کند. ما در این مقاله به چنین مشکلی خواهیم پرداخت.ساخت متا کلاس سفارشی:برای ایجاد متاکلاس سفارشی ما، متاکلاس سفارشی ما باید type متاکلاس را به ارث برده و اصطلاحا override بشه.خب ()__new__ چیه : این متدی است که قبل از ()__init__فراخوانی می شود. شی را ایجاد می کند و آن را    برمی گرداند. ما می تونیم override بکنیم  این متد رو تا بتونه نحوه ایجاد object ها رو کنترل بکنه.خب ()__init__ چیه : این متد فقط object ایجاد شده را که به عنوان پارامتر ارسال می شود مقداردهی اولیه   می کند.ما می توانیم با استفاده از تابع ()type به طور مستقیم کلاس ایجاد کنیم. می توان آن را به روش های زیر فراخوانی کرد1- هنگامی که تنها با یک آرگومان فراخوانی می شود،type را برمی گرداند2- هنگامی که با سه پارامتر فراخوانی می شود، یک کلاس ایجاد می کند:نام کلاس (class name)تاپل دارای کلاس های پایه است که توسط کلاس به ارث برده می شود (Tuple having base classes inherited by class)دیکشنری کلاس (class dictionary): به عنوان یک فضای نام محلی برای کلاس عمل می کند که با متدها و متغیرهای کلاس پر شده است . به مثال زیر توجه کیند:def test_method(self):	print(&quot;This is Test class method!&quot;)class Base:	def myfun(self):		print(&quot;This is inherited method!&quot;)Test = type(&#x27;Test&#x27;, (Base, ), dict(x=&quot;abc&quot;, my_method=test_method))print(&quot;Type of Test class: &quot;, type(Test))test_obj = Test()print(&quot;Type of test_obj: &quot;, type(test_obj))test_obj.myfun()test_obj.my_method()print(test_obj.x)Type of Test class:  &lt;class &#039;type&#039;&gt;
Type of test_obj:  &lt;class &#039;__main__.Test&#039;&gt;
This is inherited method!
This is Test class method!
abcحالا بیایید بدون استفاده مستقیم از ()type یک متاکلاس ایجاد کنیم.در مثال زیر، ما یک متاکلاس MultiBases ایجاد می کنیم که بررسی می کند آیا کلاس ایجاد شده از بیش از یک base class ارث بری کرده و اگه اینطور نباشه یک خطا ایجاد می کند.class MultiBases(type):	def __new__(cls, clsname, bases, clsdict):		if len(bases)&gt;1:			raise TypeError(&quot;Inherited multiple base classes!!!&quot;)		return super().__new__(cls, clsname, bases, clsdict)class Base(metaclass=MultiBases):	passclass A(Base):	passclass B(Base):	passclass C(A, B):        passTraceback (most recent call last):
  File &amp;quot&lt;stdin&gt;&amp;quot, line 2, in &lt;module&gt;
  File &amp;quot&lt;stdin&gt;&amp;quot, line 8, in __new__
TypeError: Inherited multiple base classes!!!نکته آخر اینکه بیشتر اوقات ما از متاکلاس استفاده نمی کنیم، معمولاً برای چیزهای پیچیده استفاده می شودهمانطور که در مثال بالا دیدیم، متاکلاس ها سلسله مراتب وراثت را منتشر می کنند. همه زیر کلاس ها را نیز تحت تاثیر قرار خواهد داد. اگر چنین شرایطی داریم باید از متاکلاس ها استفاده کنیم.اگر بخواهیم کلاس را به طور خودکار تغییر دهیم، وقتی ایجاد شد، از متاکلاس استفاده می کنیم.برای توسعه API، ممکن است از متاکلاس ها استفاده کنیمیه نقل قولی از Tim Peters راجب این مبحث هست که جالبه :متاکلاس ها جادوی عمیق تری هستند که 99 درصد کاربران هرگز نباید نگران آن باشند. اگر تعجب می کنید که آیا به آنها نیاز دارید یا خیر، نیازی ندارید (افرادی که واقعاً به آنها نیاز دارند با اطمینان می دانند که به آنها نیاز دارند و نیازی به توضیح در مورد دلیل آنها ندارند).میدونم یه مقداری طولانی شد ولی امیدوارم مفید باشه?</description>
                <category>بهزاد دبیری</category>
                <author>بهزاد دبیری</author>
                <pubDate>Sat, 19 Aug 2023 22:59:20 +0330</pubDate>
            </item>
                    <item>
                <title>توی این قسمت قراره با iterator یا تکرارگر آشنا بشیم</title>
                <link>https://virgool.io/@m_62361481/%D8%AA%D9%88%DB%8C-%D8%A7%DB%8C%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D9%82%D8%B1%D8%A7%D8%B1%D9%87-%D8%A8%D8%A7-iterator-%DB%8C%D8%A7-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1%DA%AF%D8%B1-%D8%A2%D8%B4%D9%86%D8%A7-%D8%A8%D8%B4%DB%8C%D9%85-eub215btp3yn</link>
                <description>تکرار گر یا iterator یک شی است که شامل تعدادی مقدار است.یک iterator یک شی قابل پیمایش است به این معنی که می تواند تمام مقادیر خود را تک به تک برگرداند.از نظر فنی در پایتون، iterator یک شی است که پروتکل تکرار کننده را اجرا می کند که شامل متدهای ()__iter__ و ()__next__ است.تکرارگر یا Iterator در مقابل iterable یا قابل تکرار:لیست ها(lists)، چندتایی ها (tuples)،فرهنگ لغت ها (dictionaries) و مجموعه ها (sets)  همه اشیاء قابل تکرار یا در اصطلاح  iterable هستند.این ها ظرف های قابل تکرار (iterable) هستند که می توانید از آن ها یک تکرار کننده (iterator) تهیه کنید.همه این اشیاء دارای یک متد با نام ()iter هستند که برای به دست آوردن یک تکرار کننده (iterator) مورد استفاده قرار می گیرد.مثال: در این مثال در یک چندتایی (Tuple) یک تکرار کننده (iterator) را به دست می آورد و هر کدام از مقادیر آن  را به صورت تکی چاپ می کند.myt_uple = (&quot;tom&quot;, &quot;rose&quot;, &quot;nina&quot;)my_iterator = iter(my_tuple)print(next(my_iterator))print(next(my_iterator))print(next(my_iterator))output :tomroseninaحتی رشته ها (Strings) هم جزو اشیاء قابل تکرار (iterable) هستند و می توان از آن ها یک تکرار کننده (iterator) به دست آورد.my_str = &quot;banana&quot;my_iterator = iter(my_str)print(next(my_iterator))print(next(my_iterator))print(next(my_iterator))print(next(my_iterator))print(next(my_iterator))print(next(my_iterator))output :bananaایجاد یک تکرار کننده (iterator) در پایتون:برای ایجاد یک شی/کلاس  به عنوان یک تکرار کننده (iterator) باید متدهای ()__iter__ و ()__next__ را برای شی خودتان پیاده سازی کنید.همونطور که میدونیم همه کلاس ها تابعی با نام ()__init__ دارند، که به شما اجازه می دهد مقداردهی های اولیه را در هنگام ایجاد شی انجام دهید.متد ()__iter__ عملکردی مشابه ()__init__ دارد که شما می توانید مقداردهی اولیه و کارهایی از این قبیل را انجام دهید اما همیشه باید شی تکرار کننده (iterator) را خودتان برگردانید.متد ()__next__ به شما اجازه انجام عملیات می دهد، و باید آیتم های بعدی را به ترتیب برگردانید.دستور stopiteration:برای جلوگیری از ادامه تکرار تا بی نهایت از دستور stopiteration استفاده می کنیم. به مثال زیر توجه کنید:class Friend:def __init__(self):self.names = [&#x27;amir&#x27;, &#x27;kevin&#x27;, &#x27;jack&#x27;, &#x27;bob&#x27;]def __iter__(self):for i in self.names:yield idef __next__(self):copy_names = self.namesfor name in copy_names:return nameelse:raise StopIterationحالا برای صدا زدن آبجکت هایی که از کلاس Friend ساخته میشوند باید از تابع next استفاده کنید تا در هر مرحله فقط یک آیتم برگشت داده شود:fr = Friend()print( next(fr) )print( next(fr) )print( next(fr) )print( next(fr) )amirkevinjackbobامیدوارم که مطالب مورد استفاده باشه?</description>
                <category>بهزاد دبیری</category>
                <author>بهزاد دبیری</author>
                <pubDate>Fri, 18 Aug 2023 19:48:09 +0330</pubDate>
            </item>
                    <item>
                <title>composition and aggregation in python</title>
                <link>https://virgool.io/@m_62361481/httpsvirgooliom62361481composition-and-aggregation-in-python-yt6ylbqbjawf-yt6ylbqbjawf</link>
                <description>                                                                                                                               :Concept of Inheritanceوراثت مکانیزمی است که به ما امکان می دهد تمام ویژگی های یک کلاس دیگر را بگیریم و آنها را در کلاس خود اعمال کنیم. کلاس والد کلاسی است که ویژگی ها و توابع از آن مشتق می شوند (به عنوان کلاس پایه نیز نامیده می شود). کلاس فرزند به کلاسی اطلاق می شود که از ویژگی های کلاس دیگری (که به عنوان کلاس مشتق نیز شناخته می شود) استفاده می کند. یک رابطه Is-A نام دیگری برای وراثت است.Syntax:  #Parent classclass Parent:                   # Constructor           # Variables of Parent class           #Methods            ...#Child class inheriting Parent class  class Child(Parent):              #constructor of child class           # variables of child class            #methods of child class            ...                                                                                                                            :Concept of Compositionترکیب نوعی تجمع است که در آن دو موجودیت به شدت به یکدیگر وابسته هستند.1- این یک جزء رابطه را نشان می دهد.2- هر دو موجودیت در ترکیب به یکدیگر وابسته هستند.3- هنگامی که ترکیبی بین دو نهاد وجود دارد، شیء تشکیل‌شده نمی‌تواند بدون موجودیت دیگر وجود داشته باشد. #Code to demonstrate Composition  #Class Salary in which we are #declaring a public method annual salary class Salary:        def __init__(self, pay, bonus):        self.pay = pay        self.bonus = bonus         def annual_salary(self):        return (self.pay*12)+self.bonus  #Class EmployeeOne which does not  # inherit the class Salary yet we will # use the method annual salary using # Composition class EmployeeOne:    def __init__(self, name, age, pay, bonus):        self.name = name        self.age = age         #Making an object in which we are         #calling the Salary class          #with proper arguments        self.obj_salary = Salary(pay, bonus)  # composition     #Method which calculates the total salary    # with the help of annual_salary() method    # declared in the Salary class     def total_sal(self):        return self.obj_salary.annual_salary() #Making an object of the class EmployeeOne #and providing necessary arguments emp = EmployeeOne(&#x27;Geek&#x27;, 25, 10000, 1500) #calling the total_sal method using  #the emp object print(emp.total_sal())Output:121500اکنون همانطور که در کد بالا می بینیم، با موفقیت متد یک کلاس کاملاً متفاوت را در کلاس دیگری که کلاس را به ارث نمی برد با استفاده از مفهوم Composition فراخوانی کرده ایم.                                                                                                                             :Concept of Aggregationتجمیع مفهومی است که در آن یک شیء از یک کلاس می تواند شیء مستقل دیگری از کلاس دیگر را داشته باشد یا به آن دسترسی داشته باشد.- نشان دهنده رابطه Has-A است.- این یک ارتباط یک طرفه است، یعنی یک رابطه یک طرفه. به عنوان مثال، یک بخش می تواند دانشجو داشته باشد، اما برعکس امکان پذیر نیست و در نتیجه ماهیت یک طرفه دارد.- در تجمیع، هر دو ورودی می توانند به صورت جداگانه باقی بمانند، به این معنی که پایان دادن به یک موجودیت بر موجودیت دیگر تأثیری نخواهد داشت.#Code to demonstrate Aggregation #Salary class with the public method  #annual_salary() class Salary:    def __init__(self, pay, bonus):        self.pay = pay        self.bonus = bonus     def annual_salary(self):        return (self.pay*12)+self.bonus # EmployeeOne class with public method# total_sal()class EmployeeOne:     # Here the salary parameter reflects     #upon the object of Salary class we    # will pass as parameter later    def __init__(self, name, age, sal):        self.name = name        self.age = age         # initializing the sal parameter        self.agg_salary = sal   # Aggregation     def total_sal(self):        return self.agg_salary.annual_salary() #Here we are creating an object  #of the Salary class #in which we are passing the  #required parameters salary = Salary(10000, 1500) #Now we are passing the same  #salary object we created #earlier as a parameter to  #EmployeeOne class emp = EmployeeOne(&#x27;Geek&#x27;, 25, salary) print(emp.total_sal())Output:121500از کد بالا، همان خروجی را خواهیم داشت که در قسمت Composition دریافت کرده بودیم. اما تفاوت این است که در اینجا ما یک شی از کلاس Salary در کلاس EmployeeOne ایجاد نمی کنیم.به جای اینکه یک شی از کلاس Salary در خارج ایجاد کنیم و آن را به عنوان پارامتری از کلاس EmployeeOne ارسال کنیم که همان نتیجه را به همراه دارد. </description>
                <category>بهزاد دبیری</category>
                <author>بهزاد دبیری</author>
                <pubDate>Mon, 07 Aug 2023 21:35:40 +0330</pubDate>
            </item>
            </channel>
</rss>