شئ گرایی در پایتون (قسمت سوم)
با سلام همراهان zerotohero.ir . در ادامه مبحث شئ گرایی در پایتون در خدمت شما هستم. در قسمت های قبلی (قسمت اول و قسمت دوم) دربارهی کلاس ها، صفت ها، نحوه ساخت اشیاء و مقدار دهی اشیاء بحث کردیم.
صفت های داخلی کلاس
هر کلاس پایتون دارای صفت های داخلی و از قبل تعریف شده ایست که همانند سایر صفت ها و متدها با عملگر نقطه پس از نام شئ قابل دست یابی اند. استفاده از این متدها در بعضی موارد میتواند مفید باشد. این صفت ها عبارت اند از :
__dict__: یک دیکشنری حاوی فضای نام های موجود در کلاس را برمیگرداند.
__doc__: اگر در کلاس مستنداتی را تعریف کرده باشید متن آن را برمیگرداند، اگر تعریف نکرده باشید چیزی را برنمیگرداند.
__name__: نام کلاس را برمیگراند.
__module__: نام ماژولی که کلاس در آن تعریف شده است را برمیگرداند که در حالت تعاملی و عادی مقدار __main__ را برمیگرداند.
__bases__: یک تاپل شامل کلاس هایی که از آن ها ارث بری کرده است را برمیگرداند. به عبارتی نام کلاس های پایه را برمیگرداند.
با یک مثال تمام متدهای بالا را بررسی میکنیم.
class Box: 'this is a documentation for this class' boxes = 0 def __init__(self,width,height,z): self.width=width self.height=height self.z=z Box.boxes =+ 1 def value_ofBox(self): return self.height*self.width*self.z def displayDimensions(self): print "W is : ", self.width, "H is : ",self.height,"Z is :",self.z obj = Box(10,10,10) print obj.value_ofBox() print "Box.__doc__:",Box.__doc__ print "Box.__name__:",Box.__name__ print "Box.__module__:",Box.__module__ print "Box.__bases__:",Box.__bases__ print "Box.__dict__:",Box.__dict__
خروجی کد بالا به صورت زیر است :
۱۰۰۰ Box.__doc__: this is a documentation for this class Box.__name__: Box Box.__module__: __main__ Box.__bases__: () Box.__dict__: {'__module__': '__main__', 'value_ofBox': <function value_ofBox at 0x03363A30>, 'boxes': 1, 'displayDimensions': <function displayDimensions at 0x033639B0>, '__doc__': 'this is a documentation for this class', '__init__': <function __init__ at 0x033639F0>}
تخریب اشیاء
پایتون شئ هایی که دیگر نیازی به آن ها نیست را به طور خودکار پاک میکند تا مقدار حافظه اشغال شده توسط آن آزاد شود. پردازشی که طی آن به طور مداوم بلاک های حافظه ای که دیگر در حال استفاده نیستند را اصلاح میکند، اصطلاحا جمع آوری زباله (Garbage Collection) گویند. این پردازش در طول اجرای برنامه در حال اجراست و هنگامی که ارجاعی به شئ وجود نداشته باشد، trigger آن فعال میشود.
وقتی به شئ نام جدید یا یک ظرف جدید(tuple,list,dictionary) میدهیم تعداد ارجاع های مربوط به آن شئ افزایش میابد. وقتی که شئ را با متد del پاک میکنیم یا اینکه ارجاع آن به خارج از محدوده باشد از تعداد ارجاع های شئ مربوطه کاسته خواهد شد. وقتی که تعداد ارجاع ها به صفر برسد پایتون به طور خودکار آن شئ را از حافظه پاک میکند.
در مثال زیر انواع ارجاع ها , افزایش ارجاع یا کاهش آن را ملاحظه میکنید:
a = 40 # Create object <40> b = a # Increase ref. count of <40> c = [b] # Increase ref. count of <40> del a # Decrease ref. count of <40> b = 100 # Decrease ref. count of <40> c[0] = -1 # Decrease ref. count of <40>
معمولا شما متوجه پاک شدن شئ از حافظه نمیشوید. یک کلاس میتواند با یک متد خاص به اسم __del__ پیاده سازی شود که در اصطلاح به آن تخریب کننده (Destructor) نیز میگویند. جای یاد آوری است که در قسمت ها قبلی به متدی به نام __init__ اشاره شد که آن را سازنده کلاس (constructor) مینامند و کار آن ایجاد و مقدار دهی شئ است. شما میتوانید اطلاعاتی را که میخواهید هنگام پاک شدن کلاس نمایش داده شود را در متد __del__ بنویسید. در ادامه نمونه ای از سورس کلاس قبلی که با تخریب کننده نوشته شده آورده شده است.
class Box: 'this is a documentation for this class' boxes = 0 def __init__(self,width,height,z): self.width=width self.height=height self.z=z Box.boxes =+ 1 def value_ofBox(self): return self.height*self.width*self.z def displayDimensions(self): print "W is : ", self.width, "H is : ",self.height,"Z is :",self.z def __del__(self): print "Class Destroyed!" b = Box(10,12,14) b2 = b b3 = b print id(b),id(b2),id(b3) del b del b2 del b3 output : 52748896 52748896 52748896 Class Destroyed!
تا بدینجا با مبحث شئ گرایی در پایتون به طور کامل آشنا شدیم. در مقاله های بعدی به بحث وراثت در شئ گرایی خواهیم پرداخت. با zerotohero.ir همراه باشید…
مطالب زیر را حتما مطالعه کنید
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
آشنایی با رشته در پایتون
برنامه نویسی چند نخی در پایتون
تولید اعداد Random با Python
1 Comment
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
سلام.
اقا دمت گرم ، عالی بود.
چندین تا سایت مراجعه کردم اما همش مطالب چرت و پرت.
اما اینجا واقعا یاد گرفتم.
لطفا اموزش سوکت نویسی در پایتون هم اموزششو بزار ، ممنونم.