شی و کلاس در پایتون | به زبان ساده
پیش از این در مطلب «برنامهنویسی شیئگرا در پایتون — یک راهنمای مقدماتی برای مبتدیان» و «مفهوم کلاس در برنامه نویسی — همراه با نمونه مثال عملی» به مفاهیم اساسی شیئگرایی در پایتون پرداخته شده است. در این مطلب، مفهوم شیئ و کلاس در پایتون و روش ساخت کلاس و استفاده از آن در پایتون به طور کامل و همراه با ارائه مثالهای متعدد و متنوع آموزش داده خواهد شد.
شی و کلاس در پایتون
«زبان برنامهنویسی پایتون» (Python Programming Language)، یک «زبان برنامهنویسی شیئگرا» (Object Oriented Programming Language | OOP) است. برخلاف «زبانهای برنامهنویسی رویهای» (Procedure Oriented Programming) که در آنها تاکید اصلی روی توابع است، در زبانهای برنامهنویسی شیئگرا تمرکز بر «شیئ» (Objects) است. شیئ، یک مجموعه از دادهها (متغیرها) و متدها (توابع) است که روی دادهها کار میکند و کلاس، یک پیشطرح (Blueprint) برای شیئ محسوب میشود.
میتوان به کلاس به عنوان یک اسکیس (پیشنمونه) از خانه نگریست. کلاس، حاوی همه جزئیات پیرامون طبقات، درها، پنجرهها و دیگر موارد است. بر اساس این توضیحات، خانه ساخته میشود. خانه یک شیئ است. بسیاری از خانهها را میتوان بر اساس توضیحات ساخت، میتوان اشیای زیادی را نیز از یک کلاس ساخت. به شیئ، نمونهای از یک کلاس نیز گفته میشود و فرایند ساخت این شیئ را نمونهسازی میگویند.
تعریف یک کلاس در پایتون
در این بخش از مطلب شیئ و کلاس در پایتون مفهوم کلاس بیان شده است. همانطور که تعریف توابع با کلیدواژه def شروع میشود، در پایتون، یک کلاس نیز با کلیدواژه class ساخته میشود. اولین رشته docstring نام دارد و دارای توصیفی کوتاه درباره کلاس است. اگرچه وجود داکاسترینگ الزامی نیست، اما توصیه میشود. در اینجا، یک تعریف کوتاه از کلاس ارائه شده است.
class MyNewClass: '''This is a docstring. I have created a new class''' pass
یک کلاس، یک «فضای نام محلی» (Local Namespace) جدید میسازد که در آن، همه خصیصهها تعریف شدهاند. خصیصهها میتوانند داده یا تابع باشند. همچنین، خصیصههای خاصی در آن وجود دارند که با دو زیر خط (ــ) شروع میشوند. برای مثال، __doc__ یک داکاسترینگ از آن کلاس را به کاربر میدهد. همزمان با آنکه یک کلاس تعریف میشود، یک شیئ کلاس جدید با نام مشابه ساخته میشود. این شیئ کلاس امکان دسترسی به خصیصههای متفاوت را همچون نمونهسازی اشیای جدید از آن کلاس، فراهم میکند.
1class MyClass:
2 "This is my second class"
3 a = 10
4 def func(self):
5 print('Hello')
6
7# Output: 10
8print(MyClass.a)
9
10# Output: <function MyClass.func at 0x0000000003079BF8>
11print(MyClass.func)
12
13# Output: 'This is my second class'
14print(MyClass.__doc__)
هنگامی که برنامه اجرا میشود، خروجی به صورت زیر خواهد بود:
10 <function 0x7feaa932eae8="" at="" myclass.func=""> This is my second class
- برای دیدن فیلم آموزش پایتون فرادرس مقدماتی + اینجا کلیک کنید.
ساخت یک شیئ در پایتون
در این قسمت از مطلب شیئ و کلاس در پایتون روش ساخت یک شیئ در پایتون بیان شده است. میتوان مشاهده کرد که شیئ کلاس برای دسترسی به خصیصههای گوناگون قابل استفاده است. همچنین، میتوان از آن برای ساخت نمونههای شیئ جدید (نمونهسازی) از آن کلاس، استفاده کرد. روال ساخت یک شیئ، شبیه به فراخوانی تابع است.
1>>> ob = MyClass()
این امر موجب میشود که یک شیئ نمونه جدید با نام ob ساخته شود. میتوان به خصیصههای گوناگون یک شیئ با استفاده از پیشوند نام شیئ دسترسی داشت. خصیصهها ممکن است داده یا متد باشند. متد یک شیئ، توابع متناظری از آن کلاس هستند. هر شیئ تابع که یک کلاس خصیصه است، متدی را برای اشیای آن کلاس تعریف میکند. این بدین معنا است که، نظر به آنکه MyClass.func یک شیئ تابع (خصیصه کلاس) است، ob.func شیئ متد است.
1class MyClass:
2 "This is my second class"
3 a = 10
4 def func(self):
5 print('Hello')
6
7# create a new MyClass
8ob = MyClass()
9
10# Output: <function MyClass.func at 0x000000000335B0D0>
11print(MyClass.func)
12
13# Output: <bound method MyClass.func of <__main__.MyClass object at 0x000000000332DEF0>>
14print(ob.func)
15
16# Calling function func()
17# Output: Hello
18ob.func()
برخی پس از مطالعه کد بالا ممکن است متوجه پارامتر self در تعریف تابع درون کلاس شده باشند، اما متد، به سادگی به عنوان ()ob.func بدون هیچ آرگومانی فراخوانی شده است و کار هم میکند. این امر بدین دلیل است که هنگامی که یک شیئ متدهای آن را فراخوانی کند، خود تابع به عنوان اولین آرگومان پاس داده میشود. بنابراین، ()ob.func به (MyClass.func(ob ترجمه میشوند.
به طور کلی، فراخوانی یک متد با یک لیست از n آرگومان، مساوی با فراخوانی تابع متناظر با یک لیست آرگومان است که با قرار دادن شیئ متدها پیش از اولین آرگومان ساخته میشود. به همین دلیل، اولین آرگومان از تابع در کلاس باید خود شیئ باشد. این مورد به طور متداول self نامیده میشود. میتوان آن را نامگذاری نیز کرد، ولی به شدت توصیه میشود که از قرارداد پیروی شود. با خواندن این مطلب، مخاطب باید با شیئ کلاس، شیئ نمونه، شیئ تابع، شیئ متد و تفاوت آنها آشنا شده باشد.
سازندهها در پایتون
توابع کلاس در پایتون که با دو خط زیر (ــ) آغاز میشوند، توابع ویژه نامیده میشوند، زیرا دارای معنای خاصی هستند. یکی از موارد مشخص جذاب، تابع ()__init__ است. این تابع زمانی فراخوانی میشود که یک شیئ جدید از آن کلاس نمونهسازی شود. این نوع تابع در برنامهنویسی شیئگرا، سازنده نیز نامیده میشود. به طور معمول، از سازنده برای مقداردهی اولیه به همه متغیرها استفاده میشود.
1class ComplexNumber:
2 def __init__(self,r = 0,i = 0):
3 self.real = r
4 self.imag = i
5
6 def getData(self):
7 print("{0}+{1}j".format(self.real,self.imag))
8
9# Create a new ComplexNumber object
10c1 = ComplexNumber(2,3)
11
12# Call getData() function
13# Output: 2+3j
14c1.getData()
15
16# Create another ComplexNumber object
17# and create a new attribute 'attr'
18c2 = ComplexNumber(5)
19c2.attr = 10
20
21# Output: (5, 0, 10)
22print((c2.real, c2.imag, c2.attr))
23
24# but c1 object doesn't have attribute 'attr'
25# AttributeError: 'ComplexNumber' object has no attribute 'attr'
26c1.attr
در مثال بالا، یک کلاس جدید برای ارائه اعداد پیچیده تعریف میشود. این کلاس، دارای دو تابع است: ()__init__ برای مقداردهی اولیه به متغیرها (به طور پیشفرض صفر هستند) و ()getData برای نمایش عدد به شیوه مناسب. یک نکته جالب پیرامون گام بالا که باید متذکر شد، آن است که خصیصههای یک شیئ روی fly قابل ساختن هستند. یک خصیصه جدید attr برای شیئ c2 ساخته و خوانده شد. اما این کار، آن خصیصه را برای شیئ c1 نساخت.
حذف خصیصهها و شیئها
در بخش پایانی از مطلب شیئ و کلاس در پایتون روش حذف خصیصهها و اشیا بیان شده است. هر خصیصهای از یک شیئ را میتوان در هر زمان با استفاده از عبارت del حذف کرد. برای درک بهتر موضوع، کد زیر را باید در شل پایتون اجرا کرد و خروجی را دید.
1>>> c1 = ComplexNumber(2,3)
2>>> del c1.imag
3>>> c1.getData()
4Traceback (most recent call last):
5...
6AttributeError: 'ComplexNumber' object has no attribute 'imag'
7
8>>> del ComplexNumber.getData
9>>> c1.getData()
10Traceback (most recent call last):
11...
12AttributeError: 'ComplexNumber' object has no attribute 'getData'
حتی میتوان خود شیئ را با استفاده از عبارت del حذف کرد.
>>> c1 = ComplexNumber(1,3) >>> del c1 >>> c1 Traceback (most recent call last): ... NameError: name 'c1' is not defined
در واقع، موضوع از اینها پیچیدهتر است. هنگامی که (c1 = ComplexNumber(1,3 انجام میشود، یک نمونه شیئ جدید در حافظه ساخته میشود و نام c1 به آن متصل میشود. در دستور del c1، این اتصال حذف میشود و نام c1 از فضای نام متناظر حذف میشود. در صورتی که هیچ نام دیگری به شیئ اتصال پیدا نکند، همچنان در حافظه باقی میماند و پس از مدتی تخریب میشود. این تخریب خودکار از اشیای بدون ارجاع در پایتون، بازیافت حافظه نامیده میشود.
سلام
حذف پراپرتیس آبجک چجوریه؟ الان روی پایتون 3.9.4 هستم با کیورد del جواب نمی ده