<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های The Maz Life</title>
        <link>https://virgool.io/feed/@maz</link>
        <description>جستجوگر در عالم مجاز و حقیقت</description>
        <language>fa</language>
        <pubDate>2026-06-16 17:38:51</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/149054/avatar/avatar.png?height=120&amp;width=120</url>
            <title>The Maz Life</title>
            <link>https://virgool.io/@maz</link>
        </image>

                    <item>
                <title>شی گرایی در عالم پایتون  (بخش دوم)</title>
                <link>https://virgool.io/@maz/%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-%D8%B9%D8%A7%D9%84%D9%85-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-srv5q8dwp5ji</link>
                <description>in Python searchخب بخش مهمی که باید بیشتر توجه داشت همین بخش هست پس توصیه ایمنی را جدی گرفته مراقبه خودتون باشید به این بخش خوب گوش جان بسپاریداین جایی است که ما از کلاس برای تعریف برنامه استفاده می‌کنیم به طوری که هر شی از همان نوع کلاس دارای ویژگی‌های یک‌سان باشد.پایتون وظایف ویژه‌ای را برای کلاس ها ، که به وسیله پسوند ها و پیشوند ها که با علامت  &quot;_&quot;  هستند، فراهم می‌کندپایتون یک تابع مخصوص به نام __init__ را ارایه می‌دهد که هر زمان که ما یک نمونه از یک کلاس بسازیم و این تابع برای ایجاد طرح کلی شی استفاده می‌شود و ابتدای نمونه سازی از کلاس اجرا خواهد شد درست مانند تابع constructor یا construct  به ترتیب در زبان های php , jsتابع __init__ هر زمان که یک شی ایجاد می‌شود فراخوانی می‌شود. تابع به یک پارامتر اجباری نیاز دارد که با کلمه &quot;self&quot; فراخوانی میشود. در اینجا &quot;self&quot; به خود شی ساخته شده از روی کلاس اشاره میکنهمثال 1-1class PostalAddress:
    def __init__(self):
        passدر داخل این تابع __init__  ، ما متغیرهای نمونه محلی را ایجاد می کنیم که حالت (ویژگی های قابل شناسایی) شیء ساخته شده از این کلاس را تعریف می کنند. مانند خط 3 و 4مثال 2-11 class PostalAddress:
2  def __init__(self):
3    self.name = &amp;quotABC&amp;quot
4    self.street = &amp;quotCentral Street - 1&amp;quot

5 cP1 = PostalAddress()
6 print(cP1.__dict__)
# {&#039;street&#039;: &#039;Central Street - 1&#039;, &#039;name&#039;: &#039;ABC&#039;}عبارت &quot;self&quot; یک کلمه کلیدی در پایتون نیست، این یک عرف در برنامه نویسی پایتون است که از واژه&quot;self&quot; به عنوان یک مرجع برای  دسترسی به شی ساخته شده از کلاس استفاده می‌کنیم، با این حال، ما می‌توانیم آن را هر چیزی که می‌خواهیم، برای مثال، نامگذاری کنیم. مثال 3-1class PostalAddress:
  def __init__(theClassInstance):
 theClassInstance.name = &amp;quotABC&amp;quot
      theClassInstance.street = &amp;quotCenteral Street - 1&amp;quotولی روش بهتر برای استفاده همان عبارت &quot;self&quot; که دیگر برنامه نویسان منظور شما متوجه خواهند شدتوابع در کلاس، جنبه رفتاری آن شی را فراهم می‌کنند. اجازه دهید فقط یک تابع برای چاپ حالت فعلی شی ایجاد کنم. تابع را prnInfo می‌نامندمثال 4-11class PostalAddress:
2    def __init__(self):
3        self.name = &amp;quotABC&amp;quot
4        self.street = &amp;quotCenteral Street - 1&amp;quot
5    def prnInfo(self):
6       print(&amp;quotName =&gt; &amp;quot, self.name, &amp;quot  Street =&gt;&amp;quot, self.street)

7 cP1 = PostalAddress()
8 cP1.prnInfo()
#Name =&gt;  ABC   Street =&gt; Centeral Street - 1دقیقاً مانند عملکرد __init__ ، تمام توابع خود را به عنوان یک پارامتر اجباری می گیرند. با این حال ، هنگامی که ما این تابع را فراخوانی می کنیم یعنی تابع &quot;prnInfo&quot; در خط 8 ، هیچ پارامتری را به آن منتقل نمی کنیم زیرا پایتون نمونه شی را به صورت خودکار می گیرد. به عبارتی به خط های 3 و 4 اشاره میکنیمما همچنین می توانیم به جای یک شیء ، توابع را با استفاده از کلاس فراخوانی کنیم ، اما اگر بخواهیم متد را از طریق کلاس فراخوانی کنیم با این حال، اگر می‌خواهیم متد را از طریق کلاس ، فراخوانی کنیم. باید شی ساخته شده از کلاس را به تابع &quot;prnInfo&quot; معرفی کنیم  ، پایتون نمی‌داند که کدام یک به عنوان &quot;self&quot; عمل می‌کند.فراخوانی با استفاده از کلاس به شکل زیر است: خط های 1 و 3مثال 5-11 cP1 = PostalAddress()# Calling the function using class, we provide the instance
2 PostalAddress.prnInfo(cP1)# This is same as
3 cP1.prnInfo() تا اینجای کار کلاس PostalAddress شبیه همان شی های  استاتیک بود، زیرا ما نام و خیابان را در داخل تابع &quot;__init__&quot; مقدار دهی کردیم. با این حال، ما می‌خواهیم اشیا نمونه دیگری با مقادیر مختلف بسازیم.این مقادیر را به عنوان پارامترهای ورودی در تابع init در نظر بگیرید که در کد زیر نشان‌داده شده‌است:مثال 6-1# PostalAddress taking name and street as input parameter
class PostalAddress:
    def __init__(self, name, street):
        self.name = name
        self.street = street
    def prnInfo(self):
        print(&amp;quotName =&gt; &amp;quot, self.name, &amp;quot  Street =&gt;&amp;quot, self.street)

cP1 = PostalAddress(&amp;quotABC&amp;quot, &amp;quotCentral Street - 1&amp;quot)
cP1.prnInfo()
cP2 = PostalAddress(&amp;quotDEF&amp;quot, &amp;quotCentral Street - 2&amp;quot)
cP2.prnInfo()خب ما میتونیم به پارامتر های تابع __init__ مقادیر پیش فرض بدهیم که بعدا در هنگام فراخوانی درصورت فراموشی مقدار دهی به شی ، ان مقدار پیش فرض جایگزین شود که از بروز خطا جلوگیری کند در خط 2مثال 7-11 class PostalAddress:
2  def __init__(self, name = &amp;quotDefault Name&amp;quot, street = &amp;quotCentral Street - 1&amp;quot):
3     self.name = name
4     self.street = street

5 cP0 = PostalAddress();                                            # 0 arguments
6 cP1 = PostalAddress(&amp;quotABC&amp;quot)                                    # 1 argument
7 cP2 = PostalAddress(&amp;quotDEF&amp;quot, &amp;quotCentral Street - 2&amp;quot)     # 2 argumentsایجاد نمونه متغیرها در توابع چندگانهاین معنی نیست که ما فقط می‌توانیم متغیرهای مورد نظر را فقط درون تابع__init__ ایجاد کنیم. ما می‌توانیم همین کار را در هر یک از اعضای کلاس انجام دهیم.تنها مشکل این است که آن متغیرها تنها زمانی ایجاد خواهند شد که تابع ایجاد متغیر نمونه فراخوانی می‌شود. اشاره به خط 5 و 6 و فراخوانی در خط 9مثال 8-11 class PostalAddress:
2  def __init__(self, name = &amp;quotDefault Name&amp;quot, street = &amp;quotCentral Street - 1&amp;quot):
3   self.name = name
4    self.street = street
  
5 def createMember(self):
6   self.newMember = &amp;quotTemporary Value&amp;quot

7 cP0 = PostalAddress();
8 print(cP0.__dict__);
# prints {&#039;name&#039;: &#039;Default Name&#039;, &#039;street&#039;: &#039;Central Street - 1&#039;}
9 cP0.createMember();
10 print(cP0.__dict__);
# print {&#039;name&#039;: &#039;Default Name&#039;, &#039;street&#039;: &#039;Central Street - 1&#039;, &#039;newMember&#039;: &#039;Temporary Value&#039;}متغیرهای کلاساغلب اوقات، آدرس‌های افراد در یک جامعه کوچک، برخی از اطلاعات مشترک برای مثال کد پستی را به اشتراک می‌گذارند.این به این معنی است که تمام اشیا کلاس PostalAddress باید کد پستی یکسانی داشته باشندیك راه برای دستیابی به این هدف نوشتن كد پستی در متد __init__ به گونه ای است كه در هر شیء ایجاد شده از این کلاس در دسترس باشد.مثال 9-1class PostalAddress:
    def __init__(self, name = &amp;quotDefault Name&amp;quot, street = &amp;quotCentral Street - 1&amp;quot):
        self.name = name
        self.street = street
        self.postalcode = 12345         # Hardcoding Postal Code

cP0 = PostalAddress();
print(cP0.__dict__);  # prints {&#039;postalcode&#039;: 12345, &#039;name&#039;: &#039;Default Name&#039;, &#039;street&#039;: &#039;Central Street - 1&#039;}
cP1 = PostalAddress(&amp;quotABC&amp;quot)
print(cP1.__dict__);
 # prints {&#039;postalcode&#039;: 12345, &#039;name&#039;: &#039;ABC&#039;, &#039;street&#039;: &#039;Central Street - 1&#039;}با این حال، اگر بخواهیم بعد کد پستی را تغییر دهیم، این یک مشکل است. تنها راه برای انجام این کار، تغییر دستی برای هر شی است،مثال 10-1cP0.postalcode = 54321
cP1.postalcode = 54321
...
...
cPn.postalcode = 54321این کار نه تنها خسته کننده نیست بلکه راه را برای بروز اشتباهات هموار میکند پس راه کار چیست؟خوشبختانه، ما می‌توانیم متغیرهای کلاس داشته باشیم که در این موارد میتوانند به روز شوندclass variable یک متغیر است که نه در داخل متدهای موجود کلاس تعریف نمیشود بلکه در سطح بدنه کلاس تعریف می شود این متغیر در کلیه نمونه های PostalAddress در دسترس است بیایید ببینیم چگونه می توانیم متغیرهای کلاس را تعریف کنیممثال 1-2class PostalAddress:
  postalCode = 12345;   # class Variable 
   def __init__(self, name = &amp;quotDefault Name&amp;quot, street = &amp;quotCentral Street - 1&amp;quot):
      self.name = name
      self.street = street

cP0 = PostalAddress()
print(cP0.postalCode) # print 12345قبل از اینکه به راه‌هایی برای تغییر متغیر کلاس نگاهی بیندازیم به گونه‌ای که هر نمونه از کلاس با postalCode جدید به روز می‌شود، ما نیاز به درک یک تفاوت عمده بین متغیرهای کلاس و متغیرهای نمونه داریم. class variable به عنوان بخشی از کلاس تعریف می شوند و به عنوان نمونه نیستنداگر ما دستور &quot;__cP0.__dict&quot;  را اجرا کنیم  &quot;کد پستی&quot; را در آنجا پیدا نمی کنیم. مثال 2-2print(cP0.__dict__)
# prints {&#039;street&#039;: &#039;Central Street - 1&#039;, &#039;name&#039;: &#039;Default Name&#039;}برای یافتن &quot;کد پستی&quot; ، باید از خود کلاس متغیرش را فراخوانی کنیم نه از شی ساخته شده از کلاسمثال 3-2print(PostalAddress.__dict__)
# prints {&#039;postalCode&#039;: 12345. .... } amongst many other thingsاین توالی جستجوی پایتون است که ابتدا به &quot;نمونه&quot; نگاه می‌کند، و اگر تابع / عملکرد پیدا نشود، به &quot;کلاس&quot; نگاه می‌کند. به همین دلیل است که ما می‌توانیم cP۰.postalCode را با استفاده از شی نمونه چاپ کنیم.روش کلاسمتغیرهای کلاس را می توان به دو روش یا با استفاده از خود کلاس یا با استفاده از تابع کلاس تغییر داد. برای تغییر استفاده از خود کلاس، باید کد زیر را بنویسیممثال 4-2PostalAddress.postalCode = 54321با این کار &quot;کد پستی&quot; نه تنها برای موارد موجود ، بلکه برای تمام مواردی که پس از اجرای این خط ایجاد می شود ، تغییر خواهد کرد.مثال 5-2# Instance created BeforecP0 = PostalAddress()
cP1 = PostalAddress()

PostalAddress.postalCode = 54321
# Instance created after changecP2 = PostalAddress()

print(cP0.postalCode)   # prints 54321
print(cP1.postalCode)   # prints 54321
print(cP2.postalCode)   # prints 54321راه دیگر برای دستیابی به نتیجه مثال بالا class method ها در پایتون است  متد ()classmethod یک روش‌ کلاس را برای عملکرد مشخص داده است. شما میتوانید برای شی های ساخته شده از کلاس به مقدار class variable دسترسی داشته و آنرا تغییر دهید.  cls در خط 7 خیلی شبیه به &quot;self&quot;  عمل میکند. در حالی که روش کلاس تعیین‌کننده است، ما باید به وضوح به زبان پایتون بگوییم که این روش یک روش کلاسی است که از کلمه کلیدی استفاده می‌کند.classmethod@ یعنی در خط 6مثال 6-21 class PostalAddress:
2  postalCode = 12345;   # class Variable
3  def __init__(self, name = &amp;quotDefault Name&amp;quot, street = &amp;quotCentral Street - 1&amp;quot):
4     self.name = name
5     self.street = street

 6 @classmethod
 7 def newPostalCode(cls, newcode):
 8   cls.postalCode = newcodeخب در&quot; Instance methods&quot; کلمه ,&quot;self&quot; را به عنوان پارامتر اجباری می گیرند ، در حالی کهClass methods کلمه &quot;class&quot; را به عنوان پارامتر اجباری می گیرند.در هر دو مورد ، لازم نیست که ما صراحتا از Instance or Class عبور کنیم ، پایتون به طور خودکار از آن مراقبت می کند.اکنون می توانیم این روش جدید newPostalCode را از طریق Instance یا از طریق Class فراخوانی کنیم. در هر دو مورد ، نتیجه نهایی یکسان خواهد بود. در اینجا نحوه استفاده ما از روش Instance استفاده میکنیممثال 7-2cP0 = PostalAddress()
cP1 = PostalAddress()# Call using Instance
PostalAddress.newPostalCode(9999)
cP2 = PostalAddress()

print(cP0.postalCode)   # prints 9999
print(cP1.postalCode)   # prints 9999
print(cP2.postalCode)   # prints 9999به پایان آمد این دفتر حکایت همچنان باقی است :)</description>
                <category>The Maz Life</category>
                <author>The Maz Life</author>
                <pubDate>Wed, 06 May 2020 03:43:47 +0430</pubDate>
            </item>
                    <item>
                <title>شی گرایی در عالم پایتون  (بخش اول)</title>
                <link>https://virgool.io/@maz/%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%D8%B1-%D8%B9%D8%A7%D9%84%D9%85-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-sgka5mhm7fzy</link>
                <description>in Python search شیوه فکر راجع به مسئله و سازماندهی کدها متفاوت است بعضی ها رویه ای هستن بعضی ها شی گرایی که امروزه بیشتر برنامه نویسی ها بسته به مسئله شیوه فکرشون از نوع شی گرایی هست که ما تو این مقاله بهش میپدازیم:1-شی گرایی چیست؟ راهی برای ایجاد و مدیریت اشیاء ارائه می دهند و کارش این است که برنامه دارای ساختار و اسکلت باشد2-در اینجا منظور از یک شی چیست؟شی به دو صورت استاتیک و داینامیک موجود هست که به بررسی هر کدام خواهیم پرداخت 1- استاتیکحالت استاتیک یک جسم را نشان دهد، یعنی اشیا تغییر نمی‌کنند، با ویژگی‌هایی که به عنوان کلید (نام)و  مقدار های آن  ذکر شده‌اند.به عنوان مثال، اجازه دهید آدرس پستی مردم را در یک جامعه محلی در نظر بگیریم، ما می‌توانیم آدرس‌های فردی را نمایش دهیممثال 1-1p1 = {&#039;name&#039; : &amp;quotABC&amp;quot , &#039;street&#039;: &amp;quotCentral Street - 1&amp;quot }
p2 = {&#039;name&#039; : &amp;quotDEF&amp;quot , &#039;street&#039;: &amp;quotCentral Street - 2&amp;quot }
p3 = {&#039;name&#039; : &amp;quotAXY&amp;quot , &#039;street&#039;: &amp;quotCentral Street - 1&amp;quot } 2 داینامیکاکثر زبانهای برنامه نویسی برای ایجاد یک شی کلمه کلیدی به نام کلاس ارائه می دهند که باید شی از آن ساخته شود و پایتون نیز از این قاعده مستثنی نیست.3- کلاس چیست؟یک کلاس طرح و نقشه را تعریف می کند ، به عبارت دیگر یک کلاس شامل متغیرها، روش‌ها، توابع است.. می‌توانیم آدرس های پستی بالا را نیز با استفاده از اشیا کلاس نیز ذخیره کنیم.می توان کلاس ها را به دو بخش دارای طرح کلی یا بدون طرح کلی تقسیم بندی کرد1-کلاس بدون طرح کلیما می‌توانیم با ایجاد یک کلاس PostalAddress  بدون یک طرح کلی از پیش تعیین‌شده شروع کنیم. پایتون به اضافه کردن اعضای زمان اجرا (identifiable ویژگی)اضافه کردن به اشیا اجازه می‌دهد و ما از همان برای ایجاد آدرس افراد در همان محله که مشابه آدرس های داده شده  p۱ و p۲ در بالا &quot;مثال 1-1&quot; استفاده می‌کنیممثال 2-1class PostalAddress:
    pass2-کلاس با طرح کلی: https://vrgl.ir/uWhBv ما می‌توانیم به دو روش به کلاس دسترسی داشته باشیم: بدون ایجاد شی و ایجاد یک شی. بدون ایجاد یک شیبه منظور دستیابی به عملکرد درون کلاس، تمام کاری که باید انجام دهید این است که کلاس را با نام کلاس خود صدا کنید وسپس &quot;.&quot;و بعد از آن تابع موجود در کلاس را صدا بزنید . در کلاس های که طرح کلی یا بدنه ندارند این طور فراخوانی با error همراه خواهد بودمثال 3-1PostalAddress.designer()
#error
PostalAddress.first_appeared()
#errorبا ساختن شیمثال 4-1cP1 = PostalAddress() 
# Create an Instance for person ABC
cP1.name = &amp;quotABC&amp;quot 
cP1.street = &amp;quotCentral Street - 1&amp;quot 
 # Create an Instance for person DEF
 cP2 = PostalAddress() 
cP2.name = &amp;quotDEF&amp;quot
 cP2.street = &amp;quotCentral Street - 2&amp;quotحالا ایجاد یک شی یک کار سخت نیست تمام کاری که شما باید انجام دهید این است که از متغیری به نام &quot;cP2&quot;,&quot;cP1&quot; در این مورد استفاده کنید و آن را به &quot;class PostalAddress&quot; نسبت دهید و سپس با کمک اپراتور &quot;.&quot; که می‌توانید از توابع داخل کلاس استفاده کنید یا میتوانید به آن شی متغییر اضافه کنید همانند مثال 4-1  اشیاء نیز می توانند تمام آنچه که به آنها اختصاص داده شده را با استفاده از یک متد داخلی به نام __dict__ نمایش داده شوند.مثال 5-1print(cP1.__dict__)
print(cP2.__dict__)
# The output will be same as p1 and p2
{&#039;name&#039;: &#039;ABC&#039;, &#039;street&#039;: &#039;Central Street - 1&#039;}
{&#039;name&#039;: &#039;DEF&#039;, &#039;street&#039;: &#039;Central Street - 2&#039;}می‌توانیم به عناصری با کلیدها دسترسی داشته باشیم با روش زیرمثال 6-1print(p1[&amp;quotname&amp;quot])  # prints ABC  example 1-1

print(cP1.__dict__[&amp;quotname&amp;quot])  # prints ABC from objects example 1-4روش هایی که در بالا اشاره شد برای شی های ساده مناسب هست اما کلاس با بدنه نه تنها قابلیت اضافه کردن رفتارها را ارایه می‌دهد (در نتیجه اجازه تغییر حالت اشیا را می‌دهد)، بلکه ویژگی‌های اضافی نیز فراهم می‌کند که به برنامه نویسان در مدیریت اشیا به روش ساده و آسان کمک می‌کند.قبل از اینکه به قابلیت‌های ارائه‌شده توسط کلاس نگاه کنیم، اجازه دهید ابتدا به یکی از اشکالات عمده کد که در بالا نوشته شده نگاه کنیم. می‌توانیم قوانینی را که در بالا نوشته شده را تغییر دهیم.1 p1 = {&#039;name&#039; : &amp;quotABC&amp;quot , &#039;street&#039;: &amp;quotCentral Street - 1&amp;quot }
2 p2 = {&#039;names&#039; : &amp;quotDEF&amp;quot , &#039;street&#039;: &amp;quotCentral Street - 2&amp;quot, &amp;quotNewVar&amp;quot : &amp;quotNot Needed&amp;quot }# and
3 class PostalAddress:
4   pass

5 cP1 = PostalAddress()
6 cP1.name = &amp;quotABC&amp;quot

7 cP2 = PostalAddress()
8 cP2.names = &amp;quotDEF&amp;quot
9 cP2.NewVar = &amp;quotNot Needed&amp;quotاشتباهاتی که در بالا صورت گرفت در خط 2 اضافه کردن کلید NewVar  به شی  p2  و همچنین در خط 8 اضافه کردن کلید names  به شی cP2 که هر کدام بدون مشکل اجرا خواهند ولی هیچ نظمی در کار نیست همان طرح کلی که از بروز خطا در برنامه های سنگین جلوگیری کند پس باز هم به کلاس با طرح کلی میرسیم که روش مناسب تری است https://vrgl.ir/uWhBv </description>
                <category>The Maz Life</category>
                <author>The Maz Life</author>
                <pubDate>Tue, 05 May 2020 23:43:13 +0430</pubDate>
            </item>
            </channel>
</rss>