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

انواع در پایتون به دو دسته ی توکار(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__ در متغیر _ قرار می گیرد.


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

۱ نظر
طراح قالب : عرفـــ ـــان قدرت گرفته از بلاگ بیان