متد در پایتون چیست؟ – به زبان ساده
پایتون زبان برنامهنویسی فوقالعادهای است اما مسیر حرفهای شدن در آن میتواند برای تازه کارها کمی ترسناک باشد. مانند همه زبانهای برنامهنویسی، پایتون هم نیاز دارد که ابتدای کار با اصول پایهای این زبان آشنا شویم، بعد از آن برای ساخت برنامههای متنوعتر و گستردهتر در حوزه علم داده شروع به مطالعات تخصصیتر کنیم. نکته اینجاست که اگر به خوبی مهارتهای پایهای خود را تقویت کنید، کارکردن با پایتون را بسیار ساده خواهید سافت. ولی توجه کنید که بسیار ضروری است، زمان اولیه آموزش خود را به آشنایی با ویژگیهایی که پایتون ارائه میدهد بگزرانید. صرف وقت برای آشنایی با اصول اولیه پایتون حتما در طول زمان ارزشش را نشان خواهد داد. در این مطلب از مجله فرادرس به بررسی یکی از اساسیترین اصول این زبان برنامهنویسی یعنی متد در پایتون خواهیم پرداخت. اینکه بهطور واضح متوجه شویم، متد در پایتون چیست و چه کاربردی دارد برای تبدیل شدن به برنامهنویس حرفهای پایتون بسیار ضروری است.
پایتون از نوع زبانهای برنامه نویسی شیگرایانه است.
هدف از این مطلب بررسی دقیق متدها در پایتون است پس درباره انواع مختلف متد در پایتون صحبت خواهیم کرد. از آنجا که متدهای پایتون میتوانند بعضی وقتها سردرگم کننده باشند تلاش میکنیم در بهترین حالت، مبحث مربوط به متدها و انواع مختلف آنها را بررسی کنیم و برای هرکدام از متدها موارد کاربردشان را با مثال و کدنویسی شرح دهیم. اما در ابتدا باید بررسی کنیم که متد در پایتون چیست؟
متد در پایتون چیست؟
در تمام مطلب و به کمک تمام مثالها میخواهیم به این سوال پاسخ دهیم که متد در پایتون چیست. در برنامه نویسی شیگرایانه اشیا به عنوان عناصر پایه عمل میکنند. همه اشیا مشخصات و رفتارهای خاص خود را دارند. مشخصات اشیا توسط ویژگیهای آنها تعریف میشوند و رفتارهایی که آنها از خود میتوانند نشان دهند توسط متدها تعریف میشوند. ویژگیها و متدهای اشیا داخل کلاسها تعریف میشوند. متدها، کدهایی هستند که قابلیت استفاده چندباره دارند یعنی در هرجای برنامه که نیاز باشد، میتوان متدها را فراخوانی کرد.
در پایتون، «متدها» (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()
خروجی کد بالا بهصورت زیر است.
در کد بالا، وقتی که متد نمونه فراخوانده شد، پایتون آرگومان «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)
خروجی متد بالا بهصورت تصویر زیر است.
میتوانید دوباره ببینید که پارامتر پیشفرض 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()
خروجی کد بالا در تصویر زیر نمایش داده شده است.
در کلاسی که داخل آن هستیم، به کمک کلمه کلیدی «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()
خروجی کد بالا بهصورت زیر خواهد بود.
ویژگی 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()
نتیجه اجرای کد بالا بهصورت زیر خواهد بود.
همانطور که میبینید این کد نیز کار میکند. میتوانیم به متدهای کلاسی با کمک نمونههایی که از کلاسها ایجاد شدهاند یا همان اشیا مربوط به هر کلاس، دسترسی داشته باشیم. اما نکته اینجاست که میتوان به متدهای کلاسی بهصورت مستقیم بدون ایجاد هیچ شی نیز دسترسی داشت. در تکه کد آمده در پایین این روش را پیادهسازی کردهایم.
1My_class.class_method()
خروجی کد بالا بهصورت زیر میشود.
بدون ایجاد شیئی از کلاس با استفاده از سینتکس Class_name.Method_name() میتوانید «متد کلاسی» (Class Method) مورد نظر خود را فراخوانی کنید.
اما این کار برای «متدهای نمونه» (Instance Methods) امکانپذیر نیست. برای فراخوانی متدهای نمونه مجبوریم که حتما از کلاس نمونهای بسازیم. در کد پایین وضعیتی را شبیهسازی کردهایم که در آن تلاش شده بدون ایجاد شی، متد نمونه بهصورت مستقیم فراخوانی شود.
1My_class.instance_method()
در اینجا به خطایی برخورد کردهایم که بیان میکند، آرگومان موقعیتی self را پیدا نمیکنیم و این بدیهی است زیرا متدهای نمونه، نمونهای از کلاس را به عنوان پارامتر پیشفرض باید دریافت کنند و در اینجا هیچ نمونهای به عنوان آرگومان برای متد فراهم نشده. به هرحال با استفاده از نام شی بهعنوان آرگومان میتوانیم این مسئله را پشت سر بگزاریم. به تکه کد آمده در پایین توجه کنید.
1My_class.instance_method(obj)
که در این صورت خروجی کد به شکل آمده در زیر میشود.
در ادامه به سومین شکل از متدها خواهیم پرداخت.
متدهای ایستا
در ادامه مطلب متد در پایتون چیست میرسیم به «متدهای ایستا» (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()
خروجی کد بالا بهصورت زیر میشود.
و در آخر اینکه متدهای ایستا را نیز میتوان به سادگی و بدون نیاز به ساخت شی از کلاس، بهصورت مستقیم فراخوانی کرد.
1My_class.static_method()
خروجی این کد بهصورت زیر است.
میتوانید متوجه شوید که خروجی هر دو روش فراخوانی متد ایستا دقیقا یکسان است و بین این دو روش در نحوه رفتار متد فرقی وجود ندارد.
بهصورت خلاصه توضیحی را درباره هر ۳ متد در فهرست زیر آوردهایم.
- متد نمونه، شی خود را میشناسد و از طریق آن شی کلاس خود را نیز میشناسد.
- متد کلاسی، کلاس خود را میشناسد.
- متد ایستا، کلاس یا نمونه خود را نمیشناسد.
متدهای جادویی
متدهای جادویی متدهایی هستند که دو «خط زیر» (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
خروجی کد بالا بهصورت زیر است.
در اینجا شیئی از کلاس ساختهایم که دو پارامتر برای نام و سن سگها به ترتیبname وage را به خود میگیرد. وقتی که ویژگیهای شی مربوط به کلاس را روی صفحه مانیتور چاپ میکنیم Bruno و1 را به عنوان خروجی بما برمیگرداند که دقیقا مقادیری هستند که انتظار داشتیم.
حالا به کد زیر دقت کنید.
1Dog2 = Dog.Year('Dobby', 2017)
2Dog2.name , Dog2.age
نتیجه اجرای کد بالا بهصورت زیر است.
در کد بالا شی دیگری از کلاس 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))
خروجی مثال بالا به شکل زیر میشود.
میتوانید ببینید که مورد استفاده این متد ایستا بسیار واضح است. اضافه کردن دو عدد که به عنوان پارامتر به متد داده شدهاند. هر وقت که نیاز داشتید دو عدد را با یکدیگر جمع ببندید میتوانید این متد را بدون داشتن دغدغه ساخت شی جدید، بهصورت مستقیم فراخوانی کنید.
جمع بندی
در انتهای مطلب، خلاصهای از مطالبِ گفته شده را به صورت فهرست درج کردهایم.
- متدهای نمونه به نمونهی ساخته شدهای از کلاس احتیاج دارند و میتوانند به ویژگیهای شی ساخته شده به کمک self دسترسی داشته باشند.
- متدهای کلاسی برای کار کردن به شی ساخته شده از کلاس احتیاج ندارند. این متدها نمیتوانند به نمونههای ساخته شده از کلاس دسترسی داشته باشند اما به خود کلاس با استفاده از کلمه کلیدی cls دسترسی دارند.
- متدهای ایستا به cls وself دسترسی ندارند. این متدها مانند توابع عادی کار میکنند اما متعلق به «فضای نام» (Namespace) کلاس هستند.
- متدهای ایستا و کلاسی با توسعهدهنده ارتباط برقرار میکنند و تاحدودی تفکرات توسعه دهنده را درباره طراحی کلاس ارتقا میدهند، که این میتواند باعث افزایش کیفیت کار شود.
البته میتوان متدها را بر اساس ساختار اعمال شده بر روی آنها نیز دستهبندی کرد، مانند متدهای لیست یا متدهای رشته در پایتون، اما دستهبندی بالا به طور خاص بر روی نوع متد تمرکز دارد.
در این مطلب از مجله فرادرس، در ابتدا تلاش کردیم که یاد بگیریم متد در پایتون چیست، چه انواعی دارد، انواع گوناگون متد چگونه پیادهسازی میشوند، متدهای جادویی را بشناسیم و کمی هم درباره تفاوت متد با تابع صحبت کردیم. هرچقدر که دانش برنامهنویسان درباره متدها بیشتر باشد و با روشهای پیادهسازی، ارثبری و دستکاری متدها بیشتر آشنا شوند، برنامههای حرفهایتری را تولید خواهند کرد.