متد در پایتون چیست؟ – به زبان ساده

۳۱۴ بازدید
آخرین به‌روزرسانی: ۰۸ بهمن ۱۴۰۲
زمان مطالعه: ۱۳ دقیقه
متد در پایتون چیست؟ – به زبان ساده

پایتون زبان برنامه‌نویسی فوق‌العاده‌ای است اما مسیر حرفه‌ای شدن در آن می‌تواند برای تازه کارها کمی ترسناک باشد. مانند همه زبان‌های برنامه‌نویسی، پایتون هم نیاز دارد که ابتدای کار با اصول پایه‌ای این زبان آشنا شویم، بعد از آن برای ساخت برنامه‌های متنوع‌تر و گسترده‌تر در حوزه علم داده شروع به مطالعات تخصصی‌تر کنیم. نکته اینجاست که اگر به خوبی مهارت‌های پایه‌ای خود را تقویت کنید، کارکردن با پایتون را بسیار ساده خواهید سافت. ولی توجه کنید که بسیار ضروری است، زمان اولیه آموزش خود را به آشنایی با ویژگی‌هایی که پایتون ارائه می‌دهد بگزرانید. صرف وقت برای آشنایی با اصول اولیه پایتون حتما در طول زمان ارزشش را نشان خواهد داد. در این مطلب از مجله فرادرس به بررسی یکی از اساسی‌ترین اصول این زبان برنامه‌نویسی یعنی متد در پایتون خواهیم پرداخت. اینکه به‌طور واضح متوجه شویم، متد در پایتون چیست و چه کاربردی دارد برای تبدیل شدن به برنامه‌نویس حرفه‌ای پایتون بسیار ضروری است.

پایتون از نوع زبان‌های برنامه نویسی شی‌گرایانه است.

هدف از این مطلب بررسی دقیق متدها در پایتون است پس درباره انواع مختلف متد در پایتون صحبت خواهیم کرد. از آنجا که متدهای پایتون می‌توانند بعضی وقت‌ها سردرگم کننده باشند تلاش می‌کنیم در بهترین حالت، مبحث مربوط به متدها و انواع مختلف آن‌ها را بررسی کنیم و برای هرکدام از متدها موارد کاربردشان را با مثال و کدنویسی شرح دهیم. اما در ابتدا باید بررسی کنیم که متد در پایتون چیست؟

متد در پایتون چیست؟

در تمام مطلب و به کمک تمام مثال‌ها می‌خواهیم به این سوال پاسخ دهیم که متد در پایتون چیست. در برنامه نویسی شی‌گرایانه اشیا به عنوان عناصر پایه عمل می‌کنند. همه اشیا مشخصات و رفتارهای خاص خود را دارند. مشخصات اشیا توسط ویژگی‌های آن‌ها تعریف می‌شوند و رفتارهایی که آن‌ها از خود می‌توانند نشان دهند توسط متدها تعریف می‌شوند. ویژگی‌ها و متدهای اشیا داخل کلاس‌ها تعریف می‌شوند. متدها، کدهایی هستند که قابلیت استفاده چندباره دارند یعنی در هرجای برنامه که نیاز باشد، می‌توان متدها را فراخوانی کرد.

در پایتون، «متدها» (Methods)، «توابعی» (Functions) هستند که با اشیا در ارتباط انحصاری قرار دارند، می‌توانند داده‌های آن‌ها را دستکاری کنند یا کارهایی را برای اشیا انجام دهند. متدها به کمک نام شی و سپس علامت نقطه .  و در آخر نام متد فراخوانی می‌شوند. متدها قسمت مهمی از برنامه نویسی‌شی گرایانه را تشکیل می‌دهند.

پایتون انواع مختلفی از این متدها را ارائه می‌دهد. یادگیری این تکه‌های مهم برای تبدیل شدن به برنامه‌نویسی کارآمد و درنتیجه برای تبدیل شدن به دانشمند داده‌ای حرفه‌ای بسیار حیاتی است.

انواع متد در پایتون

به‌طور کلی ۴ نوع متد اساسی در پایتون وجود دارد.

  • «متدهای نمونه» (Instance Method)
  • «متدهای کلاسی» (Class Method)
  • «متدهای ایستا» ( Static Method)
  • «متدهای جادویی» (Magic Methods)
نماد پایتون بر روی مانیتور کامپیوتر قرار دارد. دو طرف کامپیوتر کتاب چیده شده است.

در ادامه به بررسی هر کدام از متدها با جزییاتشان خواهیم پرداخت.

متدهای نمونه

هدف از ایجاد متدهای نمونه این است که جزییات نمونه‌ها را تنظیم کنیم یا فراخوانی کنیم. در واقع به این دلیل است که این متدها به عنوان متد نمونه شناخته می‌شوند. این متدها رایج‌‌ترین نوع متد استفاده شده در کلاس‌های پایتون هستند.

همه‌ این نوع از متدها پارامتر پیش‌فرضی به نام «self» دارند که به نمونه ساخته شده‌ از کلاس اشاره می‌کند. البته مجبور نیستید هر بار که با اشیا کار می‌کنید پارامتر «self» را ارسال کنید. همچنین می‌توانید نام این پارامتر را نیز تغییر دهید اما بهتر است که به قرارداد پایبند باشید و از همان کلمه «self» استفاده کنید.

هر متدی که داخل کلاس‌ها ایجاد می‌کنید از نوع متدهای نمونه است مگر اینکه به‌طور خاص برای پایتون آن متد را به عنوان غیر نمونه - کلاسی یا ایستا - مشخص کرده باشید. در کد زیر نحوه پیاده‌سازی متد نمونه را نمایش داده‌ایم.

1class My_class:
2  def instance_method(self):
3    return "This is an instance method."

به همین آسانی که در بالا دیدید، می‌توان متد نمونه ساخت.

برای اینکه متد نمونه را فراخوانی کنیم، باید نمونه‌ای از کلاس ایجاد کنیم. به این نمونه ساخته شده از کلاس،‌ شی می‌گویند. به کمک این شی، می‌توانید به هر متدی در کلاس دسترسی داشته باشید. به کد زیر توجه کنید.

1obj = My_class()
2obj.instance_method()

خروجی کد بالا به‌صورت زیر است.

نمایش خروجی کد مربوط به متد در پایتون چیست - 1

در کد بالا، وقتی که متد نمونه فراخوانده شد، پایتون آرگومان «self» را با شی نمونه obj  جایگزین می‌کند. به این دلیل مهم است که باید پارامتری را به عنوان پیش‌فرض در زمان تعریف متد نمونه اضافه کنیم. توجه کنید، وقتی متد instance_method()  فراخوانده شد، مجبور نیستید که پارامتر «self» را ارسال کنید. پایتون این کار را به‌جای شما انجام می‌دهد.

همراه با پارامتر پیش‌فرض «self»، می‌توانید پارامترهای دیگری را بسته به دلخواه و نیاز خود به کلاس اضافه کنید. کد نوشته شده زیر را در نظر بگیرید.

1class My_class:
2
3  def instance_method(self, a):
4    return f"This is an instance method with a parameter a = {a}."

در اینجا پارامتر اضافه شده a  را داریم. برای ادامه کار شیئی از کلاس خواهیم ساخت تا متد نمونه پیاده‌سازی شده در بالا را فراخوانی کنیم.

1obj = My_class()
2obj.instance_method(10)

خروجی متد بالا به‌صورت تصویر زیر است.

نمایش خروجی کد مربوط به متد در پایتون چیست - 2

می‌توانید دوباره ببینید که پارامتر پیش‌فرض self  را به عنوان آرگومان به متد ارسال نکرده‌ایم چون این کار را پایتون بر عهده گرفته است. اما باید آرگومان‌های دیگر را حتما برای متد مقداردهی کنیم که در این مورد، فقط یک آرگومان را باید مقداردهی کرد. پس به‌صورت دلخواه در این مثال خاص عدد ۱۰ را به عنوان مقدار پارامتر a  ارسال کرده‌ایم.

مردی با کت و شلوار در حال تفکر رو به روی لپتابش نشسته است.

اما می‌توانید از self  درون متد نمونه استفاده کنید. از self  برای دستیابی به سایر متدها و «ویژگی‌ها»ی (Attributes) کلاس، استفاده می‌شود. به تکه کد آمده در زیر توجه کنید.

1class My_class:
2
3  def __init__(self, a, b):
4    self.a = a
5    self.b = b
6
7  def instance_method(self):
8    return f"This is the instance method and it can access the variables a = {self.a} and\
9 b = {self.b} with the help of self."

توجه کنید که متد __init__()  در پایتون جزو متدهای نوع خاص است که به نام «سازنده» (Constructor) شناخته می‌شود. این متد زمانی فراخوانی می‌شود که شیئی از روی کلاس ساخته شود و به کلاس اجازه می‌دهد که «ویژگی‌ها» (Attributes) کلاس را مقداردهی اولیه کند.

کد نوشته شده زیر را در نظر بگیرید.

1obj = My_class(2,4)
2obj.instance_method()

خروجی کد بالا در تصویر زیر نمایش داده شده است.

نمایش خروجی کد مربوط به متد در پایتون چیست - 3
«برای مشاهده تصویر در اندازه اصلی، روی آن کلیک کنید»

در کلاسی که داخل آن ‌هستیم، به کمک کلمه کلیدی «self» در عبارت‌های self.a  و self.b  به متغیرهای حاضر در متد سازنده __init__()  دسترسی پیدا کرده‌ایم.

همراه با اشیا داخل کلاس، متد نمونه می‌تواند با کمک ویژگی self.__class__  به خود کلاس‌ نیز دسترسی داشته باشد. نمونه‌ای از نحوه انجام این کار در کد زیر پیاده‌سازی شده است.

1class My_class():
2
3  def instance_method(self):
4    print("Hello! from %s" % self.__class__.__name__)
5
6obj = My_class()
7obj.instance_method()

خروجی کد بالا به‌صورت زیر خواهد بود.

نمایش خروجی کد مربوط به متد در پایتون چیست - 4

ویژگی self.__class__.__name__  نام کلاس را برمی‌گرداند که هر نمونه از کلاس یا شی به آن مرتبط است.

متدهای کلاسی

هدف از ایجاد متدهای کلاسی این است که بتوان جزییات کلاس را تنظیم و فراخوانی کرد. به این دلیل است که این متدها به عنوان متد کلاسی شناخته می‌شوند. متدهای کلاسی نمی‌توانند به داده‌های خاص اشیا دسترسی داشته باشند و آن‌ها را تغییر دهند. این متدها بجای تعامل با اشیای مربوط به کلاس‌ها، در تعامل با خود کلاس هستند.

دو نکته مهم درباره متدهای کلاسی وجود دارد که باید به آن‌ها توجه کنید. این دو نکته را در زیر توضیح داده‌ایم.

  • برای اینکه بتوانید متد کلاسی تعریف کنید، باید از دکوریتور مخصوص متدهای کلاسی @classmethod  استفاده کنید. این دکوریتور مشخص می‌کند که متد تعریف شده از نوع متدهای کلاسی است.
  • همچنین متدهای کلاس همه پارامتر پیش فرضی به نام «cls» نیز دارند که به کلاس اشاره می‌کند. دوباره اشاره می‌کنیم که نام‌گذاری پارامتر پیش‌فرض به نام «cls» اجباری نیست، اما بهتر است که همیشه به قراردادهای بین جامعه برنامه‌نویسان پای‌بند باشید.
تصویر سر یک ربات بر روی نمایشگز لپتاپ

در ادامه روش ابتدایی چگونگی پیاده‌سازی متدهای کلاسی را نمایش داده‌ایم.

1class My_class:
2
3  @classmethod
4  def class_method(cls):
5    return "This is a class method."

همانطوری که قبلا اشاره کردیم، با کمک اشیای ساخته شده‌ از کلاس‌ها می‌توانید به هر متدی دسترسی داشته باشید. پس نمونه‌ای از کلاس My_class  خواهیم ساخت و تلاش می‌کنیم که متد کلاسی class_method()  فراخوانی شود.

1obj = My_class()
2obj.class_method()

نتیجه اجرای کد بالا به‌صورت زیر خواهد بود.

نمایش خروجی کد مربوط به متد در پایتون چیست - 5

همانطور که می‌بینید این کد نیز کار می‌کند. می‌توانیم به متدهای کلاسی با کمک نمونه‌هایی که از کلاس‌ها ایجاد شده‌اند یا همان اشیا مربوط به هر کلاس، دسترسی داشته باشیم. اما نکته اینجاست که می‌توان به متدهای کلاسی به‌صورت مستقیم بدون ایجاد هیچ شی نیز دسترسی داشت. در تکه کد آمده در پایین این روش را پیاده‌سازی کرده‌ایم.

1My_class.class_method()

خروجی کد بالا به‌صورت زیر می‌شود.

نمایش خروجی کد مربوط به متد در پایتون چیست - 6

بدون ایجاد شیئی از کلاس با استفاده از سینتکس Class_name.Method_name()  می‌توانید «متد کلاسی» (Class Method) مورد نظر خود را فراخوانی کنید.

اما این کار برای «متدهای نمونه» (Instance Methods) امکان‌پذیر نیست. برای فراخوانی متدهای نمونه مجبوریم که حتما از کلاس نمونه‌ای بسازیم. در کد پایین وضعیتی را شبیه‌سازی کرده‌ایم که در آن تلاش شده بدون ایجاد شی، متد نمونه به‌صورت مستقیم فراخوانی شود.

1My_class.instance_method()
نمایش خروجی کد مربوط به متد در پایتون چیست - 7
«برای مشاهده تصویر در اندازه اصلی، روی آن کلیک کنید»

در اینجا به خطایی برخورد کرده‌ایم که بیان می‌کند، آرگومان موقعیتی self  را پیدا نمی‌کنیم و این بدیهی است زیرا متدهای نمونه، نمونه‌ای از کلاس را به عنوان پارامتر پیش‌فرض باید دریافت کنند و در اینجا هیچ نمونه‌ای به عنوان آرگومان برای متد فراهم نشده‌. به هرحال با استفاده از نام شی به‌عنوان آرگومان می‌توانیم این مسئله را پشت سر بگزاریم. به تکه کد آمده در پایین توجه کنید.

1My_class.instance_method(obj)

که در این صورت خروجی کد به شکل آمده در زیر می‌شود.

نمایش خروجی کد مربوط به متد در پایتون چیست - 8

در ادامه به سومین شکل از متدها خواهیم پرداخت.

متدهای ایستا

در ادامه مطلب متد در پایتون چیست می‌رسیم به «متدهای ایستا» (Static Method). متدهای ایستا نمی‌توانند به داده‌های کلاس دسترسی داشته باشند. به عبارت دیگر، متدهای ایستا اصلا نیاز ندارند که به داده‌های کلاس دسترسی داشته باشند. این متدها خود کفا هستند و می‌توانند بصورت مستقل کار کنند. از آنجا که متدهای ایستا به هیچ «ویژگی» (Attribute) کلاسی چسبانده نشده‌اند، نمی‌توانند کیفیت درونی شی یا کلاسی را بازخوانی کنند یا تغییر دهند.

برای اینکه متد ایستایی را تعریف کنیم، می‌توانیم از دکوریتور @staticmethod  استفاده کنیم. دقیقا همان‌طور که از دکوریتور @classmethod  استفاده کرده بودیم. برعکس متدهای نمونه و متدهای کلاسی نیاز نداریم که هیچ پارامتر خاص یا پیش‌فرضی را ارسال کنیم. در کد پایین کدهای پایه برای پیاده‌سازی متدهای ایستا را نمایش داده‌ایم.

1class My_class:
2
3  @staticmethod
4  def static_method():
5    return "This is a static method."

به همین سادگی می‌توان متدی ایستا را کدنویسی کرد. توجه کنید که در این مورد ابتدایی هیچ پارامتر پیش‌فرضی نداریم. برای بکار گرفتن متدهای ایستا به سادگی، آن‌ها را با استفاده از نمونه‌های ساخته شده از کلاس فراخوانی می‌کنیم.

1obj = My_class()
2obj.static_method()

خروجی کد بالا به‌صورت زیر می‌شود.

نمایش خروجی کد مربوط به متد در پایتون چیست - 9

و در آخر اینکه متدهای ایستا را نیز می‌توان به سادگی و بدون نیاز به ساخت شی از کلاس، به‌صورت مستقیم فراخوانی کرد.

1My_class.static_method()

خروجی این کد به‌صورت زیر است.

نمایش خروجی کد مربوط به متد در پایتون چیست - 10

می‌توانید متوجه شوید که خروجی هر دو روش فراخوانی متد ایستا دقیقا یکسان است و بین این دو روش در نحوه رفتار متد فرقی وجود ندارد.

به‌صورت خلاصه توضیحی را درباره هر ۳ متد در فهرست زیر آورده‌ایم.

  • متد نمونه، شی خود را می‌شناسد و از طریق آن شی کلاس خود را نیز می‌شناسد.
  • متد کلاسی، کلاس خود را می‌شناسد.
  • متد ایستا، کلاس یا نمونه‌ خود را نمی‌شناسد.
مار پایتون بر روی لپتاپ چنبره زده است.

متدهای جادویی

متدهای جادویی متدهایی هستند که دو «خط زیر» (Underscores) به عنوان پیش‌وند و دو خط زیر به عنوان پسوند نام‌ خود دارند. به این خط زیرها «داندر» (Dunder) هم می‌گویند که مخفف عبارت «Double Under» است. این متدها را هرگز به‌صورت مستقیم فراخوانی نمی‌کنیم.

متدهای جادویی به‌صورت غیر مستقیم توسط پایتون در پشت صحنه اجرای کدها فراخوانی می‌شوند. همه این متدهای جادویی در کلاس‌های داخلی توابع پیاده‌سازی شده‌اند. اما می‌توانیم هر زمان که نیاز داشتیم متدهای جادویی را «بازنویسی» (Override) کنیم.

۱۰ مورد از این متدها را در جدول زیر آورده‌ایم اما تعداد خیلی بیشتری از این متدها در پایتون وجود دارند.

متد جادوییمورد استفاده
__new__  از کلاس‌ها، شی می‌سازد.
__del__ اشیا را حذف می‌کند.
__delete__ ویژگی را از کلاس والد حذف می‌کند.
__getattr__ مقدار «ویژگی» (Attribute) خاصی را برمی‌گرداند.
__hasattr__ بررسی می‌کند که آیا ویژگی خاصی وجود دارد یا نه.
__setattr__ ویژگی موجود را تغییر می‌دهد یا ویژگی جدیدی ایجاد می‌کند.
__dict__ دیکشنری از ویژگی‌ها و مقادیرشان برمی‌گرداند.
__dir__ لیستی از ویژگی‌های معتبر برمی‌گرداند.
__add__ دو عدد را باهم جمع می‌کند و نتیجه را برمی‌گرداند.
__sub__ دو عدد را از هم کم می‌کند و نتیجه را برمی‌گرداند.

در ادامه چند مثال خواهیم دید تا نحوه کار متدهای جادویی را درک کنیم.

مثال هایی از متدهای جادویی در پایتون

در ادامه به بررسی نحوه کار چندتا از متدهای جادویی به همراه مثال و کد می‌پردازیم تا کمی بیشتر با روش استفاده از متدهای جادویی آشنا شویم.

متد new

هنگامی که شیی را تعریف می‌کنیم، متد __new__()  فراخوانده می‌شود تا آن شی را ایجاد کند. می‌توانیم این عمل را به وسیله بازنویسی متد برای چاپ کردن رشته‌ای در زمان فراخوانی ببینیم. به عنوان مثال کد زیر را در نظر داشته باشید.

1class Fruit:
2
3   def __new__(cls, *args, **kwargs):
4       print("Object Created")
5      
6fruit1 = Fruit()

خروجی این کد به‌صورت زیر است.

Object Created

متد init

بعد از ایجاد کردن اشیا، متد __init__()  فراخوانی می‌شود تا شی ساخته شده را برای کلاس مورد نظر نمونه ‌کند. این متد شبیه سازنده‌ی JAVA و ++C است. آرگومان‌های متد __init__()  باید در زمان ساخت شی ارسال شده باشند. به مثالی که در ادامه آمده دقت کنید.

1class Fruit:
2
3   def __init__(self, name):
4       self.name = name
5       print(f"{self.name} is a fruit")
6
7fruit1 = Fruit("orange")

خروجی کد بالا به شکل زیر خواهد بود.

orange is a fruit

متد sub

متد __sub__()  در کلاس اعداد صحیح حضور دارد. هنگامی که از عملگر  استفاده می‌کنیم، پایتون به طور درونی متد __sub__()  را فراخوانی می‌کند.

به مثالی که در زیر آورده‌ایم نگاه کنید.

1class Fruit:
2
3   def __init__(self, fruits):
4      self.fruits = fruits
5
6   def __sub__(self, other):
7       return f"{self.fruits} fruits - {other.fruits}" \
8              f" fruits = {self.fruits - other.fruits} fruits"
9
10
11fruit1 = Fruit(10)
12fruit2 = Fruit(3)
13
14print(fruit1 - fruit2)

خروجی کد بالا به‌صورت زیر می‌شود.

10 fruits – 3 fruits = 7 fruits

در مثال کد بالا، متد __sub__()  را دوباره تعریف کرده‌ایم. به این کار «سربارگذاری عملگر» (Operator Overloading) می‌گویند.

به عملیاتی که ما روی این متدها انجام دادیم به ترتیب «بازنویسی متد» (Method Overriding) و «سربارگذاری عملگر» (Operator Overloading) می‌گویند نوعی دیگر از این رفتارها به نام «سربارگذاری متد» (Method Overloading) هم وجود دارد که باید بررسی کنیم. این رفتارها مخصوص متدهای جادویی و کلاس‌ها هستند. در ادامه به بررسی بازنویسی متد و سربارگذاری متد خواهیم پرداخت.

متد در پایتون چیست - مردی با پالتوی بلند میان چند مار پایتون ایستاده است.

بازنویسی متد در پایتون چیست؟

به ساختن متدی که هم‌نام متدی در کلاس والد باشد و همان پارامترها را نیز دریافت کند، بازنویسی متد می‌گویند. این اتفاق همان‌طور که گفتیم در وراثت رخ می‌دهد. زمانی که از کلاسی یک کلاس فرزند ایجاد می‌کنیم و بین آن دو رابطه وراثت برقرار می‌شود، کلاس فرزند همه متدهای کلاس والد را به ارث می‌برد.

اگر در کلاس فرزند نیاز باشد که متد به ارث رسیده را کمی تغییر دهیم بدون اینکه نام و پارامترهای متد تغییر کند به این کار بازنویسی متد می‌گویند. به مثالی که در ادامه آورده‌ایم دقت کنید.

1class ParentClass:
2
3   def get_info(self):
4       print("Parent class")
5
6class ChildClass(ParentClass):
7   pass
8
9child = ChildClass()
10child.get_info()

خروجی کد بالا به‌صورت زیر می‌شود.

Parent class

در کد بالا با اینکه کلاس فرزند خالی است. هنوز می‌تواند متد get_info()  را فراخوانی کند. زیرا کلاس فرزند، متد get_info()  را از کلاس والد خود به ارث برده است.

به مثال زیر توجه کنید.

1class ParentClass: 
2
3   def get_info(self): # old method
4       print("Parent class")
5
6class ChildClass(ParentClass): 
7
8   def get_info(self): # new method
9       print("Child class")
10
11child = ChildClass()
12child.get_info()

خروجی کد بالا به‌صورت زیر می‌شود.

Child class

در مثال بالا وقتی که متدی را در کلاس فرزند با همان نامی که متد کلاس والد دارد پیاده‌سازی می‌کنیم، متد جدید، متد قدیمی را در کلاس والد بازنویسی می‌کند و وقتی که برای اجرا متد را صدا می‌کنیم متد جدید بجای متد قدیمی فراخوانی می‌شود.

در مثال کدنویسی شده بالا، پایتون فقط متد جدید در کلاس فرزند را فراخوانی می‌کند زیرا متد جدید، متد قدیمی داخل کلاس والد را بازنویسی کرده است. البته این اتفاق فقط وقتی می‌افتد که شی که از کلاس فرزند ساخته شده است متد get_info()  را فراخوانی کند.

در صورتی که کلاس فرزند نیاز داشته باشد متدی به ارث رسیده از کلاس والد را با توجه به نیازهای خود تغییر دهد، بدون اینکه در کلاس والد رفتار متد عوض شود، می‌توان از بازنویسی متد کمک گرفت.

مهندس در حال کار با لپتاپ است.

سربارگذاری متد در پایتون چیست؟

به‌طور خلاصه، به ساخت متد جدید هم‌نام با متدی که از قبل وجود دارد اما با پارامترهای متفاوت، «سربارگذاری متد» (Method Overloading) می‌گویند. برعکس انواع دیگر زبان‌های برنامه‌نویسی شی‌گرا، پایتون به‌صورت مستقیم از سربارگذاری متد پشتیبانی نمی‌کند.

وقتی متد جدیدی تعریف می‌کنیم که نام یکسانی با متدی قدیمی دارد اما پارامترهای متفاوتی دریافت می‌کنند، پایتون متد قدیمی را با متد جدید جایگزین می‌کند بجای اینکه متدها را سربارگذاری کند. یعنی دیگر به هیچ وجه امکان فراخوانی متد قدیمی وجود ندارد. به مثالی که در ادامه آورده شده دقت کنید.

1class Car:
2
3   def drive(self): # Old method
4       print("Driving")
5
6   def drive(self, speed): # new method
7       self.speed = speed
8       print(f"Driving at {self.speed} km/h")
9
10car1 = Car()
11car1.drive()

خروجی کد بالا به‌صورت زیر خواهد بود.

TypeError: drive() missing 1 required positional argument: ‘speed’

وقتی که نمونه کد بالا را اجرا کنیم، پایتون بجای اینکه متد drive()  قدیمی را اجرا کند پیغام خطای TypeError  خواهد داد. به علت اینکه پایتون متد قدیمی drive() را با متد جدید drive(speed)  جایگزین کرده است و متد قدیمی drive() دیگر وجود ندارد.

دلیل استفاده از هر کدام از انواع متد در پایتون چیست؟

«متدهای نمونه» (Instance Methods)، رایج‌ترین نوع متدهای مورد استفاده‌اند. متدهای جادویی هم بسیار کم کاربرد هستند و فقط وقتی از آن‌ها استفاده می‌کنیم که بخواهیم آن‌ها را بازنویسی یا سربارگذاری کنیم تا با نوع داده خاصی که تعریف کرده‌ایم یا هدف خواصی که برای کلاس جدید خود داریم همخوانی داشته باشند. اما حتی با این شرایط هم فهمیدن اینکه چه زمانی باید از «متدهای کلاسی» (Class Methods) استفاده کنیم و چه زمانی از «متدهای ایستا» (Static Methods)، کمی مشکل خواهد بود.

مار پایتون وسط دو عدد لپتاپ نشسته است.

کاربرد متدهای کلاسی چیست؟

رایج‌ترین محل استفاده از متدهای کلاسی، برای ساخت «متدهای کارخانه» (Factory Methods) یا متد فکتوری است. متد فکتوری متدهایی هستند که شیئی از کلاس را به عنوان خروجی برمی‌گردانند. تقریبا شبیه به سازنده اما با موارد کاربرد متفاوت عمل می‌کنند. با کمک مثالی که در ادامه آمده تلاش می‌کنیم که مطلب را بهتر توضیح دهیم و ببینیم روش پیاده‌سازی این متد در پایتون چیست.

1class Dog:
2  def __init__(self, name, age):
3    self.name = name
4    self.age = age
5
6# a class method to create a Dog object with birth year.
7  @classmethod
8  def Year(cls, name, year):
9    return cls(name, date.today().year - year)

همان‌طور که می‌توانید ببینید در اینجا، متد کلاسی درحال تغییر کیفیت کلاس است. اگر سال تولد هر سگ را بجای سن سگ‌ها داشته باشیم، با کمک این متد می‌توانیم ویژگی‌های کلاس را تغییر دهیم. به مثال زیر توجه کنید.

1Dog1 = Dog('Bruno', 1)
2Dog1.name , Dog1.age

خروجی کد بالا به‌صورت زیر است.

نمایش خروجی کد مربوط به متد در پایتون چیست - 11

در اینجا شیئی از کلاس ساخته‌ایم که دو پارامتر برای نام و سن سگ‌ها به ترتیب name  و age  را به خود می‌گیرد. وقتی که ویژگی‌های شی مربوط به کلاس را روی صفحه مانیتور چاپ می‌کنیم Bruno  و 1  را به عنوان خروجی بما برمی‌گرداند که دقیقا مقادیری هستند که انتظار داشتیم.

حالا به کد زیر دقت کنید.

1Dog2 = Dog.Year('Dobby', 2017)
2Dog2.name , Dog2.age

نتیجه اجرای کد بالا به‌صورت زیر است.

نمایش خروجی کد مربوط به متد در پایتون چیست - 12

در کد بالا شی دیگری از کلاس Dog  با استفاده از متد Year()  ساخته‌ایم. متد Year()  کلاس Person  را به عنوان پارامتر اول -که همان cls  باشد- می‌پذیرد و سازنده را با فراخوانی دستور cls(name, date.today().year – year)  برمی‌گرداند که هم سان دستور Dog(name, date.today().year – year)  است.

همین‌طور که می‌بینید در اجرای تابع پرینت ویژگی‌های نام و سن را طوری که تعریف کرده‌ایم برمی‌گرداند. نام را خودمان داده‌ایم را و سن سگ را  از روی سال تولد، با استفاده متد کلاسی محاسبه می‌کند و سپس مقدار صحیح سن را برمی‌گرداند.

کاربرد متدهای ایستا چیست؟

این نوع از متدها برای ایجاد «توابع کمکی» (Utility Functions) استفاده می‌شود. تلاش کردیم مثالی ساده را در کد پایین پیاده‌سازی کنیم.

1class Calculator:
2 
3  @staticmethod
4  def add(x, y):
5    return x + y
6
7print('The sum is:', Calculator.add(15, 10))

خروجی مثال بالا به شکل زیر می‌شود.

نمایش خروجی کد مربوط به متد در پایتون چیست - 13

می‌توانید ببینید که مورد استفاده این متد ایستا بسیار واضح است. اضافه کردن دو عدد که به عنوان پارامتر به متد داده شده‌اند. هر وقت که نیاز داشتید دو عدد را با یکدیگر جمع ببندید می‌توانید این متد را بدون داشتن دغدغه ساخت شی جدید، به‌صورت مستقیم فراخوانی کنید.

مردی به لپتاپ خیره شده است و یک مار زرد به مرد نزدیک شده است.

جمع بندی

در انتهای مطلب، خلاصه‌ای از مطالبِ گفته شده را به صورت فهرست درج کرده‌ایم.

  • متدهای نمونه به نمونه‌ی ساخته شده‌ای از کلاس احتیاج دارند و می‌توانند به ویژگی‌های شی ساخته شده به کمک self  دسترسی داشته باشند.
  • متدهای کلاسی برای کار کردن به شی ساخته شده از کلاس احتیاج ندارند. این متدها نمی‌توانند به نمونه‌های ساخته شده از کلاس دسترسی داشته باشند اما به خود کلاس با استفاده از کلمه کلیدی cls  دسترسی دارند.
  • متدهای ایستا به cls  و self  دسترسی ندارند. این متدها مانند توابع عادی کار می‌کنند اما متعلق به «فضای نام» (Namespace) کلاس هستند.
  • متدهای ایستا و کلاسی با توسعه‌دهنده ارتباط برقرار می‌کنند و تاحدودی تفکرات توسعه دهنده را درباره طراحی کلاس ارتقا می‌دهند، که این می‌تواند باعث افزایش کیفیت کار شود.

در این مطلب از مجله فرادرس، در ابتدا تلاش کردیم که یاد بگیریم متد در پایتون چیست، چه انواعی دارد، انواع گوناگون متد چگونه پیاده‌سازی می‌شوند، متدهای جادویی را بشناسیم و کمی هم درباره تفاوت متد با تابع صحبت کردیم. هرچقدر که دانش برنامه‌نویسان درباره متدها بیشتر باشد و با روش‌های پیاده‌سازی، ارث‌بری و دستکاری متدها بیشتر آشنا شوند، برنامه‌های حرفه‌ای‌تری را تولید خواهند کرد.

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
AnalyticsVidhyaPythonGeeks
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *