متد های خاص پایتون

انواع در پایتون به دو دسته ی توکار(built_in) و تعریف شده به وسیله ی کاربر(user defined) تقسیم می شوند.انواع توکار سرعت پردازش بیشتری نسبت به انواع تعریف شده دارند،پایتون برای برطرف کردن این مشکل(سرعت کم تر انواع user defined) از متد های خاص استفاده می کند.

متدهای توکار چگونه عمل می کنند؟

مثال :


number = 10
print(number)

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


class Sample:
def __init__(self, num=0):
self.number = num

def out(self):
return self.number


متد خاص __init__ برای مقدار دهی اولیه به متغیر ها(پروپرتی های کلاس) استفاده می شود
سپس از کلاس نمونه سازی می کنیم


ins = Sample(10)


برای چاپ کردن متغیر number بدین صورت عمل می کنیم:


number = ins.out()
print(number)


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

مثال:


class Sample:
def __init__(self, num=0):
self.number = num

def __str__(self):
return str(self.number)


اکنون نمونه ای از کلاس را ایجاد کرده و متغیری را به عنوان آرگومان به آن ارسال می کنیم.


ins = Sample(10)


اکنون مقدار متغیر را پرینت می کنیم.به جای استفاده از فرمت ins.method  از فرمت زیر استفاده می کنیم:


print(ins)

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


__str__ == print
__add__ == +
__sub__ == -
__mul__ == * (left)
__rmul__ == * (right)

مثال :
نوع داده بردار را پیاده سازی می کنیم

برای ایجاد انواعی که توسط کاربر تعریف شده اند ،از کلاس استفاده می شود.

Class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y

def __add__(self, other):
return Vector(self.x+other.x, self.y+other.y)

def __sub__(self, other):
return Vector(self.x-other.x, self.y-other.y)

def __mul__(self, scalar):
return Vector(self.x*scalar, self.y*scalar)

def __rmul__(self, scalar):
return Vector(scalar*self.x, scalar*self.y)

def __str__(self):
return “Vector({0}, {1})”.format(self.x, self.y)

def __repr__(self):
return “Vector({0}, {1})”.fromat(self.x, self.y)

دو بردار نمونه سازی می کنیم


v1 = Vector(1, 2)
v2 = Vector(3, 5)

اکنون برروی این دوبردار اعمال را انجام می دهیم.


print(v1+v2)
==> Vector(4, 7)
print(v1-v2)
==> Vector(4, 7)
print(2*v1)
==> Vector(2, 4)
print(v1*2)
==> Vector(2, 4)
print(v1)
==> Vector(1, 2)
v1
==> Vector(1, 2)

لیست کامل متد ها خاص: اینجا



نکته آخر : تفاوت __str__ و __repr__ :

__str__ برای نمایش خروجی به کاربر استفاده می شود درحالی که __repr__ برای لاگینگ و دیباگینگ استفاده می شود.مقدار خروجی توسط متد __repr__ در متغیر _ قرار می گیرد.


اگر اشکالی پیدا کردید، خوشحال میشم اطلاع بدید :)

Comment Avatar

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

Post Author Avatar

شاید جنگو نقطه شروع خوبی باشه.

Comment Avatar

مقداردهی اولیه به متغیرها در متد __init__ انجام میشه؟

Post Author Avatar

تقریبا میشه گفت نه!
مقدار دهی اولیه به متغیرهای یک کلاس در کلاس متد __new__ انجام میشه

Comment Avatar

کارت درسته👌👌👌

Post Author Avatar

لطف دارید آقای aref

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی
کپی‌ رایت رزومه فید بیان قالب : عرفـــ ـــان