«کلاس» (Class) یکی از مهمترین و پرکاربردترین مفاهیم در برنامه نویسی محسوب میشود. کلاس بستری را فراهم میکند تا دادهها و توابع در کنار یکدیگر قرار بگیرند که همین امر در بهتر شدن کدنویسی بهصورت سازمانیافته نقش بهسزایی دارد. کلاس در پایتون به عنوان یکی از اساسیترین مفاهیم این زبان تلقی میشود، زیرا تمامی ماهیتهای این زبان برنامه نویسی بر پایه مفهوم کلاس بنا شدهاند. همچنین، زبان پایتون جزء زبانهای برنامه نویسی شیگرا به شمار میرود که از کلاس، به عنوان مهمترین عنصر شی گرایی، به منظور پیادهسازی اصول آن استفاده میکند.
در مطلب حاضر، سعی بر این است تا آموزش جامعی از مفهوم کلاس و اجزای اصلی آن، نحوه پیادهسازی و استفاده از آن در زبان پایتون ارائه شود. بهعلاوه، در این مقاله، با ارائه مثالهای کاربردی از زبان برنامه نویسی پایتون به نحوه پیادهسازی اصول شیگرایی با استفاده از کلاس پرداخته میشود.
مفهوم شی در زبان برنامه نویسی پایتون چیست ؟
زبان برنامه نویسی پایتون به عنوان یکی از زبانهای برنامه نویسی شی گرا محسوب میشود. یکی از اجزای اصلی مفهوم شیگرایی، «شی» (Object) است که ویژگیها و رفتارهای دادهها را مشخص میکند. تمامی اجزای زبان پایتون نظیر «لیست» (List)، «تاپل» (Tuple)، «مجموعه» (Set)، «دیکشنری» (Dictionary)، «تابع» (Function) و سایر اجزاء در قالب شی در اختیار کاربران قرار میگیرند. به عبارتی، با استفاده از دستور type()
میتوان شی بودن این اجزاء را در پایتون بررسی کرد.
حتی «انواع داده» (Data Types) در پایتون نیز از نوع و ماهیت شی هستند. به عنوان مثال، یکی از انواع دادهها در زبان برنامه نویسی پایتون، نوع داده عددی (Integer) است. متغیری که در این زبان از نوع عددی تعریف شده باشد، عضو یا شیئی از کلاس Integer محسوب میشود.
هر یک از اشیای ساخته شده در پایتون دارای یک سری «ویژگیها» (Properties) و «رفتارهایی | متدهایی» (Methods) هستند که در دنیای برنامه نویسی به آنها «مشخصه» (Attribute) گفته میشوند. به منظور تعریف هر یک از ویژگیها و متدهای اشیا میتوان از ماهیت منطقی به نام کلاس استفاده کرد. در ادامه، به مفهوم کلاس در زبان برنامه نویسی پایتون پرداخته میشود.
مفهوم کلاس در زبان پایتون چیست ؟
کلاس در برنامه نویسی، طرح اولیهای از یک شی است و با تعریف اشیای مختلف از یک کلاس میتوان موجودیتهای (اشیای) مختلفی را ایجاد کرد که در تعداد و نوع مشخصهها با یکدیگر اشتراک دارند، اما مقادیر هر یک از مشخصههای اشیاء با یکدیگر متفاوت هستند.
با استفاده از تعریف اشیای مختلف به عنوان «نمونهای» (Instance) از کلاس، میتوان به ویژگیها و متدهای درون کلاس دسترسی داشت و آنها را برای هر شی جدید، مقداردهی کرد.
در تصویر زیر، مثال ملموسی از مفهوم کلاس و شی در دنیای واقعی مشاهده میشود. در این مثال، کلاسی با نام کلاس مشتری وجود دارد که شامل ویژگیهای مشتریان و عملکرد (متد) آنها است. ایمیل و شماره تلفن مشتریان به عنوان ویژگیها و نحوه سفارش و دلیل مرجوعی کالا به عنوان متدهای کلاس تعیین شدهاند.
هر یک از مشتریان نیز به عنوان اشیای کلاس مشتری تلقی میشوند که دارای ویژگیها و متدهای کلاس با مقادیر متفاوت هستند. به عبارتی، تمامی مشتریان دارای ویژگیهای آدرس ایمیل و شماره تلفن هستند که مقدارشان برای هر یک از مشتریان، منحصربفرد است. بهعلاوه، تمامی مشتریان دارای متدهای نحوه سفارش کالا و دلیل مرجوعی محصول هستند که میتوانند با مقادیر مختلفی مقداردهی شوند. به عنوان مثال، دلیل مرجوعی مشتری اول میتواند خرابی محصول باشد، در حالی که مشتری سوم به دلیل گذشتن تاریخ انقضای محصول، تصمیم به مرجوع کردن کالا گرفته است.
زبان برنامه نویسی پایتون به عنوان یکی از زبانهای برنامه نویسی شیگرا، بر پایه مفهوم شی و کلاس طراحی شده است. به عبارتی، با تعریف هر ماهیتی در این زبان نظیر انواع ساختار داده، شی جدیدی از کلاسهای آنها ساخته میشوند که هر کدام دارای مشخصههای خاص خود هستند. به عنوان مثال، با تعریف لیست جدیدی در پایتون، شی جدیدی از کلاس لیست ساخته میشود که این شی دارای مشخصههای منحصربفردی برای عملیات مختلف نظیر درج آیتم در لیست، حذف آیتم از لیست، اندازه لیست و سایر موارد است. بدینتریب، کلاس در پایتون به عنوان یکی از مهمترین ارکان این زبان محسوب میشود. در ادامه، مزایای استفاده از کلاس در برنامه نویسی پایتون ارائه شده است.
مفهوم کلاس در برنامه نویسی — همراه با نمونه مثال عملی
مزایای استفاده از کلاس در برنامه نویسی پایتون چیست ؟
کلاس یکی از مهمترین مفاهیم در برنامه نویسی محسوب میشود که کاربرد زیادی در توسعه پروژههای نرمافزاری دارد. به دلیل مزیتهای مهم کلاس، برنامهنویسان سعی دارند از آن بهطور مکرر در برنامههای خود استفاده کنند. در ادامه، به برخی از اصلیترین مزایای استفاده از کلاس در برنامه نویسی اشاره میشود:
- در زبان پایتون، نگهداری مشخصهها و متدهای اشیا در داخل کلاس باعث میشود سازماندهی کدها بهتر انجام شود.
- کلاس به عنوان یکی از اجزای اصلی شیگرایی محسوب میشود و با استفاده از آن میتوان به پیادهسازی اصول شیگرایی نظیر کپسولهسازی و ارثبری پرداخت. از آنجا که پایتون به عنوان یکی از زبانهای برنامه نویسی شیگرا به حساب میآید، از کلاس به منظور اجرایی کرد اصول شیگرایی پشتیبانی میکند.
- با استفاده از کلاس در پایتون میتوان از قطعه کدهای نوشته شده به دفعات مختلف در پروژههای متفاوت استفاده کرد که همین امر به صرفهجویی در هزینههای زمانی برای توسعه پروژههای کامپیوتری کمک شایانی میکند.
- با استفاده از کلاس در پایتون میتوان توابع مرتبط به هم را درون یک کلاس نوشت که این قابلیت در تمیز نوشتن کدهای برنامه نقش بسزایی دارد.
در ادامه مقاله حاضر، با ارائه مثال کاربردی به نحوه تعریف کلاس در پایتون و شیوه استفاده از آن پرداخته میشود.
نحوه ساخت کلاس در زبان پایتون چگونه است ؟
به منظور تعریف کلاس در پایتون باید از کلمه کلیدی class
به همراه نام کلاس و علامت دو نقطه ( :
) استفاده کرد. در پایتون، حرف اول نام کلاس، با حرف بزرگ نوشته میشود و باید از درج فاصله در نام کلاس خودداری کرد.
پس از اعلان کلاس، میتوان از «داک استرینگ» (Docstring) استفاده کرد. داک استرینگها توضیحاتی در پایتون هستند که پس از اعلان کلاس یا تابع نوشته میشوند و شرحی از عملیات آنها را ارائه میدهند. نوشتن داک استرینگها الزامی نیستند اما به خوانایی کد و قابلفهم کردن آن کمک بهسزایی میکند. مثال زیر، نحوه تعریف یک کلاس با نام IntellipaatClass
را نشان میدهد.
class IntellipaatClass:
“Class statements and methods here'”
پس از داک استرینگها میتوان ویژگیهای کلاس را با استفاده از تعریف متغیر مشخص کرد. در مثال زیر، متغیر a
یک ویژگی برای کلاس IntellipaatClass
محسوب میشود. پس از تعریف متغیرهای کلاس، میتوان متدهای (توابع) کلاس را تعریف کرد. کلاس IntellipaatClass
دارای یک متد با نام function1
است که متنی را در خروجی چاپ میکند.
با اعلان کلاس جدید، بهطور خودکار، شیئی همنام با کلاس ایجاد میشود که میتوان با استفاده از آن، به ویژگیها و متدهای کلاس دسترسی داشت. در مثال زیر، نحوه استفاده از شی همنام با کلاس به منظور دسترسی به متغیر (ویژگی) و تابع (متد) درون کلاس ملاحظه میشود. علامت نقطه ( .
) به منظور دسترسی به مشخصههای کلاس توسط شی کاربرد دارد.
#3
class IntellipaatClass:
a = 5
def function1():
print('Welcome to Intellipaat')
#accessing attributes using the class object of same name
IntellipaatClass.function1()
print(IntellipaatClass.a)
خروجی قطعه کد فوق در ادامه ملاحظه میشود:
Welcome to Intellipaat 5
نحوه تعریف کلاس در زبان پایتون با استفاده از تابع Type()
تابع type()
علاوهبر این که نوع ماهیتها را در زبان پایتون مشخص میکند، کاربرد دیگری نیز دارد. از این تابع میتوان برای ایجاد کلاس در پایتون نیز استفاده کرد. این تابع سه آرگومان به عنوان ورودی خود بهصورت type(
میپذیرد که در ادامه به توضیح آنها پرداخته شده است:
- آرگومان name
: نام کلاس جدید را مشخص میکند. این نام توسط ویژگی __name__
کلاس، قابل دسترس است.
- آرگومان bases
: تاپلی از کلاسهای والد کلاس جدید را مشخص میکند.
- آرگومان dct
: دیکشنریای از متدها و ویژگیهای کلاس جدید را معین میکند.
در قطعه کد زیر، مثالی از نحوه کاربرد تابع type()
برای ساخت کلاس در پایتون ارائه شده است.
def test_method(self):
print("This is Test class method!")
# creating a base class
class Base:
def myfun(self):
print("This is inherited method!")
# Creating Test class dynamically using
# type() method directly
Test = type('Test', (Base, ), dict(x="atul", my_method=test_method))
# Print type of Test
print("Type of Test class: ", type(Test))
# Creating instance of Test class
test_obj = Test()
print("Type of test_obj: ", type(test_obj))
# calling inherited method
test_obj.myfun()
# calling Test class method
test_obj.my_method()
# printing variable
print(test_obj.x)
همانطور که در قطعه کد فوق ملاحظه میشود، کلاسی با نام Test
با استفاده از تابع type
ساخته شده است که از کلاس Base
ارث میبرد و دارای یک ویژگی با نام x
و یک متد با عنوان my_method
است. خروجی قطعه کد فوق در ادامه آمده است:
Type of Test class:Type of test_obj: This is inherited method! This is Test class method! atul
نحوه استفاده از کلاس در زبان پایتون چگونه است ؟
در بخش قبل ملاحظه شد که با ایجاد کلاس در پایتون، بهطور خودکار شی همنامی با کلاس ساخته میشود و از آن میتوان به منظور دسترسی به متغیرها و توابع درون کلاس استفاده کرد.
«ایجاد نمونه» (نمونهسازی | Instantiation) یا همان تعریف شی جدید، روش دیگری است که از آن برای دسترسی به ویژگیها و متدهای درون کلاس استفاده میشود. در این روش، میتوان اشیای جدیدی با نامهای مختلف از یک کلاس ایجاد کرد و با استفاده از این اشیای جدید، به اجزای درون کلاس دسترسی داشت. به عبارتی، شی ساخته شده، رونوشتی از کلاس است که مقادیر مشخصههای آن با مقادیر مشخصههای سایر اشیای همین کلاس، فرق دارد. در قطعه کد زیر، نحوه ساخت یک شی به نام object1
ملاحظه میشود.
class IntellipaatClass:
a = 5
def function1(self):
print(‘Welcome to Intellipaat’)#creating a new object named object1 using class object
object1 = IntellipaatClass()
object1.function1()
خروجی قطعه کد فوق بهصورت زیر است:
Welcome to Intellipaat
انواع ویژگی های کلاس در زبان برنامه نویسی پایتون چیست ؟
همانطور که پیش از این توضیح داده شد، «ویژگیهای کلاس» (Class Properties) متغیرهایی هستند که اطلاعات مربوط به شی را ذخیره میکنند. ویژگیهای پایتون را میتوان به دو دسته کلی بهصورت فهرست زیر تقسیمبندی کرد:
- ویژگیهایی که توسط برنامه نویس تعریف میشوند:
- «متغیرهای کلاس» (Class Variables)
- «متغیرهای نمونه» (Instance Variables)
- ویژگیهای توکار پایتون
در ادامه مطلب حاضر، به شرح هر یک از اجزاء و قابلیتهای کلاس در پایتون به همراه مثال پرداخته میشود.
متغیرهای نمونه و متغیرهای کلاس
در کلاس پایتون میتوان دو نوع متغیر برای ذخیرهسازی دادهها تعریف کرد. این دو نوع متغیر در ادامه فهرست شدهاند:
- «متغیرهای کلاس» (Class Variables): متغیرهایی هستند که پس از اعلان کلاس تعریف میشوند. این متغیرها خارج از توابع (متدها) و در داخل کلاس قرار گرفتهاند. مقدار این نوع متغیرها برای تمامی اشیای ساخته شده از یک کلاس واحد، یکسان است. مقادیر متغیرها را صرفاً میتوان با استفاده از «متدهای کلاس» (Class Methods) تغییر داد. در بخش «انواع متدهای کلاس در پایتون» در مطلب حاضر، به توضیح متدهای کلاس پرداخته شده است.
- «متغیرهای نمونه» (Instance Variables): متغیرهایی هستند که درون توابع (متدها) و «سازندهها» (Constructors) تعریف میشوند. مقادیر این متغیرها برای هر یک از اشیای ساخته شده از یک کلاس مشابه، میتوانند متفاوت باشند. به عبارتی، متغیرهای نمونه، همان ویژگیهای کلاس محسوب میشوند و توسط نام شی یا پارامتر self
میتوان به آنها دسترسی داشت. در بخش «انواع متدهای کلاس در پایتون» در مطلب حاضر، به توضیح پارامتر self
پرداخته شده است.
در قطعه کد زیر، مثالی از متغیرهای کلاس و متغیرهای نمونه ملاحظه میشود.
class TrafficLight:
'''This is an updated traffic light class'''
# Class variable
traffic_light_address = 'NYC_Cranberry_Hicks'
def __init__(self, color):
# Instance variable assigned inside the class constructor
self.color = color
def action(self):
if self.color=='red':
# Instance variable assigned inside a class method
self.next_color = 'yellow'
print('Stop & wait')
elif self.color=='yellow':
self.next_color = 'green'
print('Prepare to stop')
elif self.color=='green':
self.next_color = 'red'
print('Go')
else:
self.next_color = 'Brandy'
print('Stop drinking ')
# Creating class objects
for c in ['red', 'yellow', 'green', 'fuchsia']:
c = TrafficLight(c)
print(c.traffic_light_address)
print(c.color)
c.action()
print(c.next_color)
print('n')
در مثال فوق، متغیر traffic_light_address
از نوع متغیر کلاس است و مقدار آن برای تمامی اشیای ساخته شده از کلاس TrafficLight
یکسان است. متغیر color
که در تابع سازنده __init__
و متغیر next_color
که در متد action
تعریف شدهاند، نمونهای از متغیرهای نمونه هستند که مقادیرشان میتوانند به ازای هر شی جدید، متفاوت باشند. خروجی قطعه کد فوق به ازای اشیای red
، yellow
، green
و fuchsia
در ادامه ملاحظه میشود.
NYC_Cranberry_Hicks red Stop & wait yellow NYC_Cranberry_Hicks yellow Prepare to stop green NYC_Cranberry_Hicks green Go red NYC_Cranberry_Hicks fuchsia Stop drinking Brandy
ویژگی های توکار کلاس در زبان پایتون چیست ؟
کلاسهای زبان پایتون علاوهبر ویژگیهایی که توسط برنامه نویس ساخته میشوند، دارای ویژگیهای توکار (پیشساخته | آماده) نیز هستند که اطلاعاتی را درباره کلاس در بر میگیرند. به ویژگیهای توکار کلاس نیز میتوان با استفاده از علامت نقطه (.) دسترسی داشت که پس از نام شی درج میشود. در ادامه، فهرستی از ویژگیهای توکار در کلاس پایتون ارائه شده است.
- ویژگی __dict__
- ویژگی __doc__
- ویژگی __name__
- ویژگی __module__
- ویژگی __bases__
در بخشهای بعدی مطلب حاضر، به توضیح کاربرد هر یک از ویژگیهای توکار ذکر شدهی بالا به همراه مثال پرداخته میشود.
ویژگی __dict__ شی در پایتون
از ویژگی __dict__
به منظور نمایش تمامی ویژگیهای کلاس به همراه مقادیر آنها در قالب دیکشنری پایتون استفاده میشود. هر شی در پایتون دارای ویژگی توکار __dict__
است که با استفاده از علامت نقطه ( .
) میتوان به آن دسترسی داشت. در قطعه کد زیر، مثالی از نحوه استفاده از ویژگی __dict__
ملاحظه میشود.
class AnimalClass:
def __init__(self,identity,age):
self.identity = identity
self.age = age
def feature(self):
if self.age == "10":
return True
else:
return False
ac = AnimalClass('Lion','10')
print(ac.__dict__)
در مثال فوق، کلاس AnimalClass
دارای دو ویژگی identity
و age
است که این دو ویژگی در هنگام ساخت شی ac
با مقادیر Lion
و 10
مقداردهی شدهاند. با استفاده از دستور ac.__dict__
، کلیه ویژگیهای کلاس در قالب دیکشنری بهصورت زیر در خروجی نشان داده میشوند:
{'identity': 'Lion', 'age': '10'}
ویژگی __doc__ شی در پایتون
اشیای پایتون دارای ویژگی توکاری با نام ac.__doc__
هستند که داک استرینگ کلاس را بازمیگرداند. چنانچه کلاسی دارای داک استرینگ نباشد، این ویژگی، مقدار None را در خروجی برمیگرداند. در قطعه کد زیر، مثالی از نحوه کاربرد ویژگی ac.__doc__
در پایتون ملاحظه میشود.
# class
class Awesome:
'This is a sample class called Awesome.'
def __init__(self):
print("Hello from __init__ method.")
# class built-in attribute
print(Awesome.__doc__)
با اجرای قطعه کد فوق، خروجی بهصورت زیر است:
This is a sample class called Awesome.
ویژگی __name__ شی در پایتون
از ویژگی توکار __name__
در پایتون به منظور نمایش نام کلاس استفاده میشود. قطعه کد زیر، شیوه استفاده از این ویژگی را در پایتون نشان میدهد.
# class
class Awesome:
'This is a sample class called Awesome.'
def __init__(self):
print("Hello from __init__ method.")
# class built-in attribute
print(Awesome.__name__)
خروجی قطعه کد فوق، در ادامه ملاحظه میشود:
Awesome
ویژگی __module__ شی در پایتون
کلاس پایتون دارای ویژگی توکاری با نام __module__
است که نام ماژول کلاس را مشخص میکند. در قطعه کد زیر، مثالی از شیوه کاربرد ویژگی در پایتون ملاحظه میشود.
# class
class Awesome:
def __init__(self):
print("Hello from __init__ method.")
# class built-in attribute
print(Awesome.__module__)
خروجی قطعه کد فوق بهصورت زیر است:
__main__
ویژگی __bases__ شی در پایتون
اشیای پایتون دارای ویژگی توکار __bases__
به منظور نمایش نام کلاس والد کلاس اشیا است. در قطعه کد زیر، مثالی از کاربرد این ویژگی ارائه شده است.
class A(object):
pass
class B(A):
pass
b = B()
print (b.__bases__)
در قطعه کد فوق ملاحظه میشود که دو کلاس با نامهای A
و B
ساخته شدهاند که کلاس B
از کلاس A
ارثبری میکند. شیئی با نام b
نیز از کلاس B
ایجاد شده است و ویژگی __bases__
این شی، کلاس والد آن، یعنی کلاس A
را بهصورت زیر در خروجی نشان میدهد:
(,)
تغییر ویژگی های کلاس و حذف شی در پایتون
با استفاده از شی تعریف شده، میتوان از خارج کلاس، به ویژگیهای کلاس دسترسی داشت و مقدار متغیرهای درون کلاس را تغییر داد. در قطعه کد زیر، مثالی از نحوه تغییر مقدار متغیر a
از کلاس IntellipaatClass
ملاحظه میشود.
object1.a = 25
همچنین، میتوان شی ساخته شده را با استفاده از دستور del
بهصورت زیر حذف کرد.
del objectName
معرفی فیلم های آموزش پایتون
افرادی که علاقهمند هستند برنامه نویسی پایتون را یاد بگیرند، میتوانند از مجموعه فیلمهای جامع آموزشی پایتون سایت تم آف استفاده کنند. سایت تم آف پلتفرمی را برای آن دسته از افرادی فراهم کرده است که قصد یادگیری پایتون را بهصورت حرفهای دارند. دورههای گردآوری شده در مجموعه آموزش پایتون، شامل فیلمهای آموزشی این زبان برنامه نویسی از سطح مقدماتی تا سطح پیشرفته است و مثالهای کاربردی و پروژههای واقعی زبان پایتون را شامل میشوند. افراد میتوانند از دورههای جامع پایتون در راستای تقویت مهارت برنامه نویسی خود استفاده کنند و از آموزشهای پروژهمحور تم آف بهره بگیرند. در تصویر فوق تنها برخی از دورههای آموزشی مجموعه آموزش پایتون تم آف مشاهده میشوند.
- برای دسترسی به همه آموزش های پایتون تم آف + اینجا کلیک کنید.
انواع متدهای کلاس در زبان پایتون چیست ؟
در زبان برنامه نویسی پایتون، کلاسها میتوانند شامل چهار نوع متد باشند که در ادامه فهرستی از آنها فراهم شده است:
- «متد نمونه» (Instance Method)
- «متد کلاس» (Class Method)
- «متد ایستا» (Static Method)
- «متد خاص» (Special Method)
در ادامه مطلب حاضر به توضیح هر یک از انواع متدهای کلاس در زبان برنامه نویسی پایتون پرداخته میشود.
متد نمونه در کلاس های پایتون
متد نمونه در کلاس پایتون مجموعهای از عملیات را بر روی متغیرهای نمونه کلاس اعمال میکند. بهطور پیشفرض، هر متدی که درون کلاس ایجاد میشود، بهطور خودکار پایتون آن را به عنوان متد نمونه در نظر میگیرد. در قطعه کد زیر، مثالی از نحوه ساخت متد نمونه در کلاس پایتون ملاحظه میشود. در این مثال، متد function1
، متد نمونه برای کلاس IntellipaatClass
به حساب میآید که با استفاده از شی object1
میتوان به آن دسترسی داشت.
class IntellipaatClass:
a = 5
def function1(self):
print('Welcome to Intellipaat')
#creating a new object named object1 using class object
object1 = IntellipaatClass()
object1.function1()
متد نمونه صرفاً توسط شی کلاس مورد استفاده قرار میگیرد و اولین پارامتر این متد، پارامتر self
است که به شی ساخته شده از کلاس اشاره دارد.
پارامتر self در کلاس پایتون چیست ؟
در مثال قبل ملاحظه میشود که در هنگام تعریف متد نمونه داخل کلاس، از آرگومانی با نام self
استفاده شده با اینکه هیچ مقداری توسط شی object1
به تابع function1
منتقل نشده است.
باید خاطرنشان کرد در زبان برنامه نویسی پایتون، زمانی که یک تابع (متد) توسط شیئی صدا زده میشود، بهطور خودکار شی به عنوان پارامتر، به آن تابع ارسال میشود. به عبارتی، دستور object1.function1()
در زبان پایتون، معادل دستور object1.function1(object1)
است و پایتون بهطور خودکار تغییر زیر را بر روی توابع خوانده شده توسط اشیای کلاس اعمال میکند:
obj.method(arg1, arg2, …, argN) ➡️ MyClass.method(obj, arg1, arg2, …, argN)
به همین خاطر، اولین آرگومان تابع درون کلاس، باید آرگومان self
باشد که به شی کلاس اشاره دارد. میتوان نام self را تغییر داد و از نامهای دیگری بهجای self استفاده کرد. اما به منظور فهم دقیقتر کدها و پایبند بودن به قراردادهای زبان پایتون، بهتر است که از همان کلمه self برای اشاره به شی استفاده شود.
متد کلاس در زبان پایتون
با استفاده از متد کلاس (Class Method) میتوان مقادیر متغیرهای کلاس (Class Variables) را تغییر داد. همانطور که قبلا اشاره شد، مقادیر متغیرهای کلاس برای تمامی اشیای ساخته شده از کلاس، یکسان هستند و در داخل کلاس و بیرون از تمامی متدهای کلاس، تعریف میشوند.
به منظور تغییر مقادیر متغیرهای کلاس، میتوان از متد کلاس استفاده کرد که اعمال تغییر مقدار متغیرهای کلاس توسط این متد، بر روی تمامی اشیای ساخته شده از کلاس اثرگذار است.
به منظور تعریف متد کلاس در پایتون از دو روش «دکوراتور» (Decorator) @classmethod
و تابع classmethod()
استفاده میشود که در ادامه، به توضیح هر دو روش ذکر شده به همراه مثال پرداخته میشود.
تعریف متد کلاس با استفاده از دکوراتور
به منظور ساخت متد کلاس در پایتون، میتوان پیش از اعلان متد از دکوراتور @classmethod
استفاده کرد و پارامتر cls
را نیز به عنوان اولین پارامتر متد، در دستور اعلان متد در نظر گرفت. دکوراتور @classmethod
یک تابع توکار در پایتون محسوب میشود. در مثال زیر، نحوه ساخت متد کلاس در پایتون با استفاده از دکوراتور @classmethod
ارائه شده است.
from datetime import date
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def calculate_age(cls, name, birth_year):
# calculate age an set it as a age
# return new object
return cls(name, date.today().year - birth_year)
def show(self):
print(self.name + "'s age is: " + str(self.age))
jessa = Student('Jessa', 20)
jessa.show()
# create new object using the factory method
joy = Student.calculate_age("Joy", 1995)
joy.show()
در مثال فوق، متد calculate_age
یک نوع متد کلاس محسوب میشود که پیش از آن از دکوراتور @classmethod
استفاده شده است. پارامترهای این متد شامل سه پارامتر cls
، name
و birth_year
هستند که دو پارامتر name
و birth_year
از خارج کلاس و با دستور Student.calculate_age(“Joy”, 1995)
مقداردهی میشوند. خروجی قطعه کد فوق بهصورت زیر است.
Jessa's age is: 20 John's age is: 26
تعریف متد کلاس با استفاده از تابع Classmethod
روش دیگری که از آن میتوان به منظور ایجاد متد کلاس در پایتون استفاده کرد، تابع توکار classmethod()
است. ورودی این تابع، متدی است که در نهایت به متد کلاس تبدیل میشود. به عبارتی، خروجی تابع classmethod()
، متدی از نوع متد کلاس است. شیوه استفاده از این تابع در ادامه ملاحظه میشود.
classmethod(function)
متدی که با استفاده از تابع classmethod()
به متد کلاس تبدیل میشود، باید دارای پارامتر cls
باشد. در قطعه کد زیر، مثالی از نحوه کاربرد تابع classmethod()
برای تعریف متد کلاس ملاحظه میشود.
class School:
# class variable
name = 'ABC School'
def school_name(cls):
print('School Name is :', cls.name)
# create class method
School.school_name = classmethod(School.school_name)
# call class method
School.school_name()
در قطعه کد فوق، کلاسی با نام School
ایجاد شده است که متدی به نام school_name
دارد. این متد با استفاده از دستور classmethod(School.school_name)
، به متد کلاس تبدیل میشود و میتوان با نام کلاس به آن دسترسی داشت. خروجی قطعه کد بالا در ادامه ملاحظه میشود:
School Name is : ABC School
پارامتر cls در کلاس پایتون چیست ؟
در بخشهای قبلی اشاره شد که در متدهای نمونه کلاس، از پارامتر self
به منظور دسترسی به متغیرهای نمونه استفاده میشود. این پارامتر در اعلان متد نمونه کلاس، به عنوان اولین پارامتر لحاظ میشود که به شی ساخته شده اشاره دارد. همانند پارامتر self
، پارامتر cls
نیز اولین پارامتر متد کلاس در نظر گرفته میشود که با استفاده از آن میتوان به متغیرهای کلاس دسترسی داشت. به عبارتی، این پارامتر به کلاس ساخته شده اشاره دارد.
میتوان نام این پارامتر را تغییر داد اما به منظور خوانایی بیشتر برنامه، بهتر است از همان عبارت cls استفاده شود. خاطرنشان میشود که در متدهای کلاس صرفاً میتوان از متغیرهای کلاس استفاده کرد و در این نوع متدها نمیتوان به متغیرهای نمونه کلاس دسترسی داشت.
متد ایستا در کلاس پایتون
متدهای ایستا، متدهایی هستند که از آنها برای تغییر مقادیر ویژگیهای کلاس استفاده نمیشود. به عبارتی، این متدها بهصورت خودکفا عمل میکنند و تنها با دادههایی سروکار دارند که توسط شی مستقیماً به آنها ارسال میشوند؛ البته این نوع متدها میتوانند بدون پارامتر ورودی نیز تعریف شوند. بدینترتیب، در بین پارامترهای آنها، پارامترهای self
و cls
دیده نمیشوند. برای دسترسی به این متدها میتوان از نام کلاس یا شی استفاده کرد.
پایتون متدهایی را که در کلاس ایجاد میشوند، بهطور پیشفرض از نوع متد نمونه در نظر میگیرد. به منظور ساخت متدهای ایستا در پایتون باید از دکوراتور @staticmethod
و تابع staticmethod()
استفاده کرد تا نوع متد مستقیماً به پایتون اعلام شود. در ادامه، به توضیح هر دو روش ذکر شده برای ساخت متد ایستا پرداخته میشود.
تعریف متد ایستا با استفاده از دکوراتور
برای ایجاد متد ایستا در پایتون، میتوان پیش از اعلان متد از دکوراتور @staticmethod
استفاده کرد. این دکوراتور به عنوان یک تابع توکار در پایتون محسوب میشود. در قطعه کد زیر، مثالی از نحوه ساخت متد ایستا با استفاده از این روش ارائه شده است.
class Employee(object):
def __init__(self, name, salary, project_name):
self.name = name
self.salary = salary
self.project_name = project_name
@staticmethod
def gather_requirement(project_name):
if project_name == 'ABC Project':
requirement = ['task_1', 'task_2', 'task_3']
else:
requirement = ['task_1']
return requirement
# instance method
def work(self):
# call static method from instance method
requirement = self.gather_requirement(self.project_name)
for task in requirement:
print('Completed', task)
emp = Employee('Kelly', 12000, 'ABC Project')
emp.work()
در قطعه کد فوق، متد gather_requirement
از نوع متد ایستا است که به عنوان ورودی پارامتر project_name
را دریافت میکند و تمامی نیازمندیهای لازم برای تکمیل پروژه را در خروجی بازمیگرداند. خروجی قطعه کد فوق در ادامه ملاحظه میشود:
Completed task_1 Completed task_2 Completed task_3
تعریف متد ایستا با استفاده از تابع Staticmethod
روش دیگری که از آن میتوان به منظور ایجاد متد ایستا در پایتون استفاده کرد، تابع توکار staticmethod()
است. ورودی این تابع، متدی است که در نهایت به متد ایستا تبدیل میشود. به عبارتی، خروجی تابع staticmethod()
، متدی از نوع متد ایستا است. شیوه استفاده از این تابع در ادامه ملاحظه میشود.
staticmethod(function)
در مثال زیر، قطعه کدی ارائه شده است که نحوه ساخت متد ایستا را با تابع staticmethod()
نشان میدهد. در این مثال، تابع sample
به عنوان ورودی تابع staticmethod()
در نظر گرفته شده است تا به تابع ایستا تبدیل شود.
class Employee:
def sample(x):
print('Inside static method', x)
# convert to static method
Employee.sample = staticmethod(Employee.sample)
# call static method
Employee.sample(10)
متدهای خاص کلاس در زبان پایتون
درون کلاس میتوان به تعریف توابع مختلف پرداخت که هر کدام وظایف خاصی را انجام میدهند و این توابع، متدهای کلاس محسوب میشوند. علاوهبر توابع تعریف شده توسط برنامه نویس، پایتون «توابع توکاری» (Built-in Functions) برای کلاسهای تعریف شده در نظر میگیرد. این توابع، «توابع | متدهای خاص» (Special Functions | Special Methods) نام دارند و با علامت __
مشخص میشوند که در ادامه به فهرستی از آنها اشاره شده است:
- تابع __init__
- تابع __str__
- تابع __len__
- تابع __eq__
در ادامه مطلب، به توضیح کاربرد هر یک از توابع توکار ذکر شده در فوق به همراه مثال پرداخته میشود.
تابع __init__ پایتون در کلاس
تابع __init__
در پایتون یکی از متدهای توکار کلاس محسوب میشود. در هنگام ساخت شی از یک کلاس، تابع __init__
بهصورت خودکار صدا زده شده و دستورات داخل این تابع اجرا میشوند. این تابع به عنوان تابع «سازنده» (Constructor) در زبان برنامه نویسی پایتون به حساب میآید. معمولاً در داخل تابع __init__
متغیرهای کلاس، مقداردهی اولیه میشوند.
به منظور تعریف این تابع، میتوان همانند سایر توابع، از کلمه کلیدی def
استفاده کرد. همچنین، مانند دیگر توابع در پایتون، اولین پارامتر این متد، پارامتر self
است که به شی ساخته شده اشاره دارد. سایر پارامترها نیز پس از پارامتر self
قرار میگیرند. در مثال زیر، نمونهای از نحوه کاربرد تابع __init__
در پایتون ملاحظه میشود.
class IntellipaatClass:
def __init__(self, course):
self.course = course
def display(self):
print(self.course)
object1 = IntellipaatClass("Python")
object1.display()
در مثال فوق، به محض ساخته شدن شی object1
با دستور object1 = IntellipaatClass(“Python”)
، تابع __init__
به عنوان تابع سازنده، بهطور خودکار فراخوانده میشود. در پی فراخوانی این تابع، شی object1
و مقدار Python
به پارامترهای self
و course
ارسال میشوند. به متغیر course
میتوان در توابع دیگر داخل کلاس نیز دسترسی داشت. در مثال ذکر شده در فوق، تابعی با نام display
ساخته شده است که مقدار متغیر course
را در خروجی نشان میدهد.
تابع __str__ در کلاس پایتون
تابع __str__
به عنوان یک تابع توکار در کلاس پایتون بهمنظور چاپ مقداری در خروجی استفاده میشود. مثال زیر را در نظر بگیرید؛ در این مثال، کلاسی با نام Book
دارای تابع توکار __init__
است که سه متغیر name
، writer
و pages
را به هنگام ساخت شی از این کلاس، مقداردهی اولیه میکند. شیئی با نام b
نیز از این کلاس ساخته میشود که سه مقدار مشخص شده را به پارامترهای تابع __init__
ارسال میکند.
class Book():
def __init__(self, name, writer, pages):
self.name = name
self.writer = writer
self.pages = pages
b = Book("Moby Dick", "Herman Melville", "378")
print(b)
چنانچه قطعه کد فوق اجرا شود، خروجی بهصورت زیر خواهد بود:
<__main__.book object at>
به عبارتی، زمانی که با دستور print(b)
بخواهیم اطلاعاتی درباره شی b
از کلاس Book
را چاپ کنیم، در خروجی، اطلاعاتی درباره کلاس شی و محل ذخیرهسازی شی در حافظه نشان داده میشوند. چنانچه لازم باشد با دستور print(b)
، اطلاعاتی راجع به کلاس یا پارامترهای آن در خروجی چاپ شوند، از تابع __str__
استفاده میشود. در مثال زیر، نحوه تعریف تابع __str__
به عنوان یکی دیگر از متدهای کلاس نشان داده شده است.
class Book():
def __init__(self, name, writer, pages):
self.name = name
self.writer = writer
self.pages = pages
def __str__(self):
return f"The title of the book is {self.name}"
b = Book("Moby Dick", "Herman Melville", "378")
print(b)
خروجی قطعه کد فوق در ادامه ملاحظه میشود:
The title of the book is Moby Dick
تابع __len__ در کلاس پایتون
از تابع __len__
به منظور بازگرداندن طول یکی از ویژگیهای کلاس استفاده میشود. این متد معادل تابع len()
است. چنانچه تابع __len__
در کلاس اعلان نشده باشد و کاربر این تابع را با استفاده از شی ساخته شده فراخوانی کند، خطایی در خروجی ظاهر میشود که گویای آن است چنین تابعی برای شی وجود ندارد. بدینترتیب، تابع __len__
برخلاف تابع __str__
مقدار پیشفرضی در خروجی بازنمیگرداند.
در مثال زیر، قطعه کدی از پایتون ملاحظه میشود که در آن تابع __len__
طول مقدار پارامتر a
را در خروجی برمیگرداند. خاطرنشان میشود که برای بازگرداندن طول پارامتر میتوان از دو دستور obj.__len__
یا len()
استفاده کرد.
class GFG:
def __init__(self, a):
self.a = a
def __len__(self):
return len(self.a)
obj = GFG("GeeksForGeeks")
print(len(obj))
خروجی قطعه کد فوق در ادامه ملاحظه میشود:
13
تابع __eq__ در کلاس پایتون
از تابع __eq__
در پایتون به منظور مقایسه دو نمونه از کلاس استفاده میشود. شروط مقایسه را میتوان در داخل این متد مشخص کرد. در قطعه کد زیر، مثالی از نحوه کاربرد تابع __eq__
به منظور مقایسه دو شی از کلاس Book
ملاحظه میشود.
class Book():
def __init__(self, name, writer, pages):
self.name = name
self.writer = writer
self.pages = pages
def __eq__(self, other):
return (self.name == other.name) & (self.writer == other.writer)
b = Book("Moby Dick", "Herman Melville", "378")
a = Book("Moby Dick", "Herman Melville", "410")
print(b == a)
در قطعه کد فوق، دو شی با نامهای b
و a
از کلاس Book
ساخته شدهاند که ویژگیهای نام کتاب و نام نویسنده این دو شی با یکدیگر برابر هستند. در تابع __eq__
نیز ویژگیهای این دو شی مورد مقایسه قرار گرفتهاند. در صورت یکسان بودن مقادیر ویژگیها، خروجی قطعه کد فوق برابر با True خواهد بود در غیر این صورت مقدار False در خروجی نشان داده میشود.
انواع کلاس در زبان برنامه نویسی پایتون
در زبان برنامه نویسی پایتون انواع مختلفی از کلاس وجود دارند که هنگام نوشتن کلاس در پایتون باید نوع آن را مشخص کرد. در ادامه، انواع کلاس در این زبان فهرست شدهاند:
- «کلاس انتزاعی» (Abstract Class)
- «کلاس عینی» (Concrete Class)
- «کلاس جزئی» (Partial Class)
در بخشهای بعدی مطلب حاضر، به توضیح هر یک از انواع کلاسهای پایتون پرداخته میشود.
کلاس انتزاعی در پایتون
کلاس انتزاعی به کلاسی گفته میشود که شامل «متدهای انتزاعی» (Abstract Method) باشد. متدهای انتزاعی، متدهایی هستند که صرفاً اعلان شدهاند اما بدنه آنها تعریف نشده است. کلاسهای انتزاعی زمانی کاربرد دارند که تیم بزرگی از برنامه نویسان به توسعه پروژه بپردازند و برای توابعی با نامهای یکسان، دستورات متفاوتی را تعریف کنند.
به منظور استفاده از کلاسهای انتزاعی، نمیتوان بهطور مستقیم از آنها شی ساخت. به عبارتی، باید کلاسهای فرزندی را ایجاد کرد که از کلاسهای انتزاعی ارثبری میکنند و سپس با تعریف اشیای جدید از کلاسهای فرزند، بتوان به متدهای انتزاعی کلاسهای انتزاعی دسترسی داشت.
کلاس Abstract در پایتون — به زبان ساده
برای تعریف کلاس انتزاعی در زبان پایتون، از کتابخانه abc
استفاده میشود. از این کتابخانه، باید ماژول ABC
برای تعریف یک کلاس در پایتون فراخوانی شود. دستور abc.abstractmethod
نیز برای تعریف متد انتزاعی کاربرد دارد. در مثال زیر، نحوه ساخت کلاس انتزاعی در پایتون ملاحظه میشود.
From abc import ABC, abstractmethod
Class AbstractClassName(ABC):
@abstract method
def abstract_method_name(self):
Pass
کلاس عینی در پایتون
کلاس عینی به کلاسی گفته میشود که تمامی متدهای آن دارای مجموعهای از دستورات هستند. کلاسهای عادی، نوعی کلاس عینی محسوب میشوند که میتوان با تعریف شی از این کلاسها، به مشخصههای کلاس دسترسی داشت. همچنین، کلاسهای فرزندی که از کلاسهای انتزاعی ارثبری میکنند، به عنوان کلاسهای عینی تلقی میشوند.
کلاس جزئی در پایتون
کلاس جزئی در پایتون این امکان را به کاربران میدهد تا فایل یک کلاس را به چندین بخش مختلف تقسیم و این بخشها را در فایلهای مختلف بهصورت جداگانه ذخیره کرد. در زمان کامپایل، بهصورت خودکار تمامی فایلهای مربوط به یک کلاس با یکدیگر ترکیب میشوند.
زمانی که برنامه نویسان مختلفی بر روی یک پروژه بزرگ نرمافزاری کار میکنند، نوشتن کلاس جزئی در پایتون این امکان را برای آنها فراهم میکند تا بر روی اجزای یک کلاس واحد، کار کنند و متدهای آن را گسترس دهند. به عبارتی، با استفاده از کلاسهای جزئی میتوان بدون نیاز به ساخت مجدد کلاس، به تکمیل و توسعه اجزای کلاس در فایلهای جداگانه پرداخت.
کلاس فرزندی که از کلاس جزئی ارثبری میکند، از تمام اجزای جداگانه آن ارث میبرد. همچنین، اگر بخشی از کلاس جزئی دارای متد انتزاعی باشد، کل کلاس به عنوان کلاس انتزاعی محسوب میشود.
کاربرد دستور Pass در پایتون برای ساخت کلاس چیست ؟
زمانی که برنامه نویس، کلاسی را اعلان کرده باشد و بخواهد نوشتن دستورات داخل کلاس را به زمان دیگری موکول کند، میتواند از دستور pass
به جای کلیه دستورات کلاس استفاده کند. در صورتی که بدنه کلاس خالی باشد، در زمان کامپایل برنامه، خطا رخ میدهد. به عبارتی، دستور pass
، خروجی خاصی ندارد و صرفاً در زمان اجرای برنامه، از بروز خطا جلوگیری میکند.
از دستور pass
میتوان برای تمامی ساختارهایی نظیر حلقهها، توابع، دستورات شرطی و کلاس استفاده کرد که دارای بدنه هستند. در ادامه، مثالی از نحوه کاربرد دستور pass
در کلاس پایتون ملاحظه میشود.
class Person:
pass
پیاده سازی شی گرایی با کلاس در زبان برنامه نویسی پایتون
همانطور که در بخشهای قبلی گفته شد، پایتون به عنوان یکی از زبانهای برنامه نویسی شیگرایی محسوب میشود. شی و کلاس اجزای مهم در شیگرایی هستند که از آنها میتوان برای پیادهسازی اصول شیگرایی استفاده کرد. این اصول عبارتاند از:
- «اصل وراثت» (Inheritance Principle)
- «اصل کپسولهسازی» (Encapsulation Principle)
- «اصل انتزاع» (Abstraction Principle)
- «اصل چندریختی | پلی مورفیسم» (Polymorphism Principle)
در ادامه، به نحوه استفاده از کلاس در پیادهسازی این چهار اصل شیگرایی پرداخته میشود.
ارث بری کلاس در پایتون
بر اساس اصل وراثت، یک کلاس میتواند به عنوان «کلاس فرزند | زیر کلاس» (Child Class | Sub Class) مشخصههای خود را از مشخصههای کلاس دیگری با عنوان «کلاس والد | ابر کلاس | کلاس پایه» (Parent Class | Super Class | Base Class) به ارث ببرد. وراثت در برنامه نویسی باعث افزایش خوانایی کدهای برنامه شده و مانع از نوشتن کدهای تکراری میشود. با توجه به ساختار ارثبری کلاسها، انواع مختلفی از وراثت وجود دارند که در ادامه فهرستی از آنها ملاحظه میشود:
- «وراثت منفرد» (Single Inheritance)
- «وراثت چندگانه» (Multiple Inheritance)
- «وراثت چند سطحی» (Multi-Level Inheritance)
- «وراثت سلسلهمراتبی» (Hierarchical Inheritance)
- «وراثت ترکیبی» (Hybrid Inheritance)
در ادامه به توضیح هر یک از انواع وراثت کلاسها در پایتون به همراه مثال پرداخته میشود.
وراثت منفرد در پایتون
در این نوع ارثبری، هر کلاس فرزند تنها دارای یک کلاس والد است و تمامی ویژگیها و متدهای کلاس والد را به ارث میبرد. در مثال زیر، شیوه ارثبری کلاس فرزند از کلاس والد ملاحظه میشود.
class Intellipaat:
def course(self):
print("Python tutorial")
class hello(Intellipaat):
def func(self):
print("Welcome to intellipaat")
ob1 = hello()
ob1.func()
ob1.course()
در مثال فوق، دو کلاس با نامهای Intellipaat
و hello
وجود دارند. به منظور تبدیل کردن کلاس hello
به کلاس فرزند، کافی است نام کلاس والد، در قسمت اعلان کلاس در قسمت پرانتز نوشته شود. در این مثال، با استفاده از دستور class hello(Intellipaat)
، کلاس hello
از کلاس والد خود، یعنی کلاس Intellipaat
، ارثبری میکند. به عبارتی، کلاس hello
متد course
را از کلاس Intellipaat
به ارث میبرد و در نهایت دارای دو متد course
و func
است. بدینترتیب، شیئی که از کلاس hello
ساخته میشود، میتواند به دو متد course
و func
دسترسی داشته باشد. خروجی قطعه کد فوق در ادامه ملاحظه میشود:
Welcome to Intellipaat Python tutorial
وراثت چندگانه در پایتون
در این نوع ارثبری، هر کلاس فرزند میتواند دارای بیش از یک کلاس والد باشد. به عبارتی، کلاس فرزند تمامی مشخصههای مربوط به کلاسهای والد خود را به ارث میبرد. به منظور ایجاد وراثت چندگانه در پایتون، کافی است در زمان اعلان کلاس فرزند، نام تمامی کلاسهای والد در داخل پرانتز نوشته شوند. در ادامه، مثالی از نحوه ایجاد وراثت چندگانه در پایتون ملاحظه میشود.
class BaseClass1():
def __init__(self):
print("Base class 1")
class BaseClass2():
def __init__(self):
print("Base class 2")
class derivedClass (BaseClass1, BaseClass2):
def __init__(self):
BaseClass1.__init__(self)
BaseClass2.__init__(self)
print("derived class")
def display_all(Self):
print(self.ob1, self.ob2)
ob = derivedClass()
در مثال فوق، دو کلاس BaseClass1
و BaseClass2
کلاسهای والد برای کلاس derivedClass
هستند و با استفاده از دستور class derivedClass (BaseClass1, BaseClass2)
، ارثبری چندگانه ایجاد شده است. بدینترتیب، شی ساخته شده از کلاس derivedClass
، به تمامی متدهای دو کلاس BaseClass1
و BaseClass2
دسترسی دارد. خروجی قطعه کد فوق، در ادامه ملاحظه میشود:
Base class 1 Base Class 2 derived class
وراثت چندسطحی در پایتون
در این نوع وراثت، کلاس فرزند، از کلاس والدی ارثبری میکند که آن کلاس، به عنوان کلاس فرزند، از کلاس والد دیگری ارث میبرد. به عبارتی، کلاس فرزند، از تمامی مشخصههای کلاس والد و کلاس والد والد خود ارثبری میکند. در مثال زیر، نمونهای از ساخت وراثت چندسطحی در پایتون ملاحظه میشود.
class BaseClass():
def __init__(self):
print("Base class")
class childClass(BaseClass):
def __init__(self):
print("Child class")
class grandchildClass(childClass):
def __init__(self):
BaseClass.__init__(self)
childClass.__init__(self)
print("Grand child class")
ob1 = grandchildClass()
در مثال فوق، کلاس BaseClass
کلاس والد برای childClass
است و کلاس grandchildClass
از کلاس childClass
ارثبری میکند. بدینترتیب، کلاس grandchildClass
تمامی مشخصههای هر دو کلاس BaseClass
و childClass
را به ارث میبرد. خروجی قطعه کد فوق در ادامه ملاحظه میشود:
Base class Child class Grand child class
وراثت سلسله مراتبی در پایتون
در این نوع وراثت، ساختار ارثبری کلاسها بهصورت سلسلهمراتبی است. به عبارتی، یک کلاس والد وجود دارد که تمامی کلاسهای فرزند از آن ارثبری میکنند. در مثال زیر، نحوه ایجاد وراثت سلسلهمراتبی در پایتون ملاحظه میشود.
# Python code to demonstrate example of
# hierarchical inheritance
class Details:
def __init__(self):
self.__id=""
self.__name=""
self.__gender=""
def setData(self,id,name,gender):
self.__id=id
self.__name=name
self.__gender=gender
def showData(self):
print("Id: ",self.__id)
print("Name: ", self.__name)
print("Gender: ", self.__gender)
class Employee(Details): #Inheritance
def __init__(self):
self.__company=""
self.__dept=""
def setEmployee(self,id,name,gender,comp,dept):
self.setData(id,name,gender)
self.__company=comp
self.__dept=dept
def showEmployee(self):
self.showData()
print("Company: ", self.__company)
print("Department: ", self.__dept)
class Doctor(Details): #Inheritance
def __init__(self):
self.__hospital=""
self.__dept=""
def setEmployee(self,id,name,gender,hos,dept):
self.setData(id,name,gender)
self.__hospital=hos
self.__dept=dept
def showEmployee(self):
self.showData()
print("Hospital: ", self.__hospital)
print("Department: ", self.__dept)
def main():
print("Employee Object")
e=Employee()
e.setEmployee(1,"Prem Sharma","Male","gmr","excavation")
e.showEmployee()
print("nDoctor Object")
d = Doctor()
d.setEmployee(1, "pankaj", "male", "aiims", "eyes")
d.showEmployee()
if __name__=="__main__":
main()
در مثال فوق، سه کلاس با نامهای Details
، Employee
و Doctor
ساخته شدهاند که کلاس Details
به عنوان کلاس والد برای کلاسهای Employee
و Doctor
محسوب میشود. خروجی قطعه کد فوق در ادامه ملاحظه میشود:
Employee Object Id: 1 Name: Prem Sharma Gender: Male Company: gmr Department: excavation Doctor Object Id: 1 Name: pankaj Gender: male Hospital: aiims Department: eyes
وراثت ترکیبی در زبان پایتون
این نوع وراثت، ترکیبی از روشهای ارثبری مختلف است که در بخشهای قبلی به آنها اشاره شد. به عبارتی، میتوان انواع روشهای وراثت را با یکدیگر ترکیب کرد تا بتوان از حالات مختلف ارثبری بهره برد. به عنوان مثال، طبق تصویر زیر میتوان وراثت سلسله مراتبی را با وراثت چندگانه ترکیب کرد.
در قطعه کد زیر، نحوه ایجاد وراثت ترکیبی در پایتون ملاحظه میشود. در این مثال، کلاس University
کلاس والد برای دو کلاس Course
و Branch
است و کلاس Student
نیز فرزند دو کلاس Course
و Branch
محسوب میشود که از کلاس University
نیز ارثبری میکند.
# Creating a Base class named University:
class University:
def __init__(self):
print("Contructor of the Base class")
# Initializing a class variable named univ to store university name:
self.univ = "MIT"
def display(self): # Method to print the University Name:
print(f"The University name is: {self.univ}")
# 1st Derived or Child Class of University Class:
class Course(University):
def __init__(self):
# using "super" keyword to access members of the parent class having same name:
print("Constructor of the Child Class 1 of Class University")
University.__init__(self)
self.course = "CSE"
def display(self): # Method to print the Course Name:
# using "super" keyword to access display method defined in the parent class:
print(f"The Course name is: {self.course}")
University.display(self)
# 2nd Derived or Child Class of University Class:
class Branch(University):
def __init__(self):
print("Constructor of the Child Class 2 of Class University")
self.branch = "Data Science"
def display(self): # Method to print the Branch Name:
print(f"The Branch name is: {self.branch}")
# Derived or Child Class of Class Course and Branch:
class Student(Course, Branch):
def __init__(self):
print("Constructor of Child class of Course and Branch is called")
self.name = "Tonny"
Branch.__init__(self)
Course.__init__(self)
def display(self):
print(f"The Name of the student is: {self.name}")
Branch.display(self)
Course.display(self)
# Object Instantiation:
ob = Student() # Object named ob of the class Student.
print()
ob.display() # Calling the display method of Student class.
خروجی قطعه کد فوق در ادامه ملاحظه میشود:
Constructor of Child class of Course and Branch is called Constructor of the Child Class 2 of Class University Constructor of the Child Class 1 of Class University Contructor of the Base class The Name of the student is: Tonny The Branch name is: Data Science The Course name is: CSE The University name is: MIT
متد super کلاس در پایتون
از متد super()
در پیادهسازی اصل وراثت و به منظور دسترسی به کلاس والد از داخل کلاس فرزند استفاده میشود. این متد پارامتر ورودی ورودی دریافت نمیکند و از تکرار نام کلاس والد جلوگیری میکند. پس از متد super()
، نام متدی از کلاس والد نوشته میشود که بنا است در کلاس فرزند استفاده شود. در قطعه کد زیر، مثالی از نحوه کاربرد این متد در پایتون ارائه شده است.
class Food():
def __init__(self, name):
self.name = nameا
class Cheese(Food):
def __init__(self, brand):
super().__init__()
self.brand = brand
در قطعه کد فوق، کلاس Food
به عنوان کلاس والد برای کلاس Cheese
محسوب میشود. با استفاده از دستور super().__init__()
، متد __init__
از کلاس Food
فراخوانده شده است.
کپسوله سازی کلاس در زبان برنامه نویسی پایتون چیست ؟
کپسولهسازی یکی از چهار اصل شیگرایی محسوب میشود که میتوان با استفاده از آن، دسترسی به مشخصههای کلاس را مدیریت کرد. به عبارتی، با به کارگیری این اصل میتوان برای ویژگیها و متدهای کلاس، محدودیت دسترسی ایجاد کرد تا نتوان آنها را از خارج کلاس و حتی از طریق کلاسهای فرزند، تغییر داد. همچنین، این اصل بستری را فراهم میکند تا تمامی مشخصههای اشیا درون کلاس در کنار هم قرار گیرند که همین امر باعث میشود نوشتن کدها بهصورت سازمانیافته انجام شوند. در ادامه، به نحوه کپسولهسازی مشخصههای کلاس با ذکر مثال پرداخته میشود.
ساخت متد خصوصی در پایتون
چنانچه بخواهیم مثال ملموسی درباره کپسولهسازی در دنیای واقعی ارائه کنیم، میتوان از موتور ماشین یاد کرد که شامل اجزای مختلفی مانند شمع، سوپاپ و پیستون است. هیچ رانندهای بهطور مستقیم از اجزای موتور استفاده نمیکند. با این حال، هر یک از این اجزاء، وظیفهای را برعهده دارند که با انجام آن، موتور ماشین بهدرستی شروع به کار میکند. در دنیای برنامه نویسی شی گرا، وظایف هر یک از این اجزاء، به عنوان «متد خصوصی» (Private Method) برای کلاس موتور ماشین محسوب میشوند.
در برنامه نویسی، مستقیماً نمیتوان به متدهای خصوصی از خارج کلاس یا از طریق کلاسهای فرزند دسترسی داشت. به منظور تعریف متدهای خصوصی، پیش از نام متد، از علامت ( __
) در پایتون استفاده میشود. البته باید خاطرنشان کرد که پایتون، مانع استفاده از متد خصوصی خارج از کلاس نمیشود. به عبارتی، چنانچه از این متدها در خارج از کلاس، استفاده شوند، خطای کامپایلر رخ نمیدهد و تعریف متدهای خصوصی در پایتون فقط به سایر برنامه نویسان نشان میدهد که این متدها برای داخل کلاس استفاده میشوند. به بیان دیگر، استفاده از علامت ( __
) قراردادی برای تعیین نام متدهای خصوصی در میان برنامه نویسان است.
در مثال زیر، نحوه تعریف متد خصوصی در کلاس پایتون ملاحظه میشود. در این مثال، کلاس Person
دارای یک تابع سازنده __init__
و دو متد run
و __warmup
است که متد run
از نوع متد «عمومی» و متد __warmup
از نوع متد خصوصی است.
class Person:
def __init__(self, name):
self.name = name
def run(self):
self._warmup()
print("{} is running".format(self.name))
def _warmup(self):
print("{} is warming up".format(self.name))
jack = Person('Jack')
jack.run()
با اجرای قطعه کد فوق، خروجی زیر حاصل میشود:
Jack is warming up Jack is running
حال، چنانچه با استفاده از شی jack
از بیرون کلاس، بخواهیم به متد خصوصی __warmup
دسترسی داشته باشیم، قطعه کد فوق را بهصورت زیر تغییر میدهیم:
class Person:
def __init__(self, name):
self.name = name
def run(self):
self._warmup()
print("{} is running".format(self.name))
def _warmup(self):
print("{} is warming up".format(self.name))
jack._warmup()
خروجی قطعه کد فوق در ادامه ملاحظه میشود:
Jack is warming up
همانطور که ملاحظه شد، با فراخوانی متد خصوصی از خارج کلاس، هیچ خطای کامپایلری صورت نگرفت.
ساخت ویژگی خصوصی در پایتون
به منظور ساخت ویژگیهای خصوصی کلاس در پایتون نیز همانند متدهای خصوصی، از علامت ( __
) پیش از نام ویژگی استفاده میشود. البته باید خاطرنشان کرد که این علامت، قراردادی برای نشانهگذاری ویژگیهای خصوصی در میان برنامه نویسان است و همانند متدهای خصوصی کلاس، میتوان از خارج کلاس به ویژگیهای خصوصی کلاس دسترسی داشت.
در ادامه، مثالی از تعریف ساخت ویژگی خصوصی در کلاس ملاحظه میشود. در این مثال، در تابع سازنده __init__
، دو متغیر (ویژگی) با نامهای name
و email
ایجاد شدهاند که ویژگی name
از نوع ویژگی عمومی و ویژگی email
از نوع ویژگی خصوصی هستند.
class Person:
def __init__(self, name, email):
self.name = name
self._email = email
mark = Person("Mark", "mark@domain.com")
print(mark.name)
print(mark._email)
خروجی قطعه کد فوق در ادامه ملاحظه میشود. بر اساس خروجی حاصل شده، با استفاده از شی mark
میتوان به ویژگی خصوصی کلاس دسترسی داشت و هیچ گونه خطای کامپایلری در این باره رخ نمیدهد.
Mark mark@domain.com
انتزاع در کلاس پایتون
انتزاع با کپسولهسازی رابطه بسیار نزدیکی دارد. از کپسولهسازی برای قرار دادن ویژگیها و متدها در داخل کلاس استفاده میشود که با بهکارگیری آن، تمامی اطلاعات مرتبط با یک شی در کنار هم قرار میگیرند. انتزاع مسئولیت کنترل دسترسی به ویژگیها و متدهای داخل کلاس انتزاعی را برعهده دارد و اطلاعات آن را از کاربران پنهان میکند.
به منظور تعریف کلاس انتزاع از ماژول ABC
استفاده میشود. همچنین، برای تعریف متد انتزاعی از دکوراتور @abstractmethod
میتوان استفاده کرد. برای دسترسی به ماژول ABC
و دکوراتور @abstractmethod
، میتوان کتابخانه abc
را فراخوانی کرد. خاطرنشان میشود نمیتوان مستقیماً از کلاس انتزاعی، شی ساخت. برای استفاده از کلاس انتزاعی، باید از کلاس فرزند استفاده کرد که از کلاس انتزاعی ارثبری میکند و سپس با استفاده از شی ساخته شده از کلاس فرزند، میتوان به متدهای کلاس انتزاعی دسترسی داشت. قطعه کد زیر، مثالی از نحوه ساخت کلاس و متد انتزاعی را نشان میدهد.
# Python program demonstrate
# abstract base class work
from abc import ABC, abstractmethod
class Car(ABC):
@abstractmethod
def mileage(self):
pass
class Tesla(Car):
def mileage(self):
print("The mileage is 30kmph")
class Suzuki(Car):
def mileage(self):
print("The mileage is 25kmph ")
class Duster(Car):
def mileage(self):
print("The mileage is 24kmph ")
class Renault(Car):
def mileage(self):
print("The mileage is 27kmph ")
# Driver code
t= Tesla ()
t.mileage()
r = Renault()
r.mileage()
s = Suzuki()
s.mileage()
d = Duster()
d.mileage()
در مثال فوق، کلاس Car
نوعی کلاس انتزاعی است که یک متد انتزاعی با نام mileage
دارد که انتزاعی بودن آن با دکوراتور @abstractmethod
مشخص شده است. از پارامتر ABC
در قسمت اعلان کلاس نیز استفاده میشود تا مشخص کند این کلاس، از نوع کلاس انتزاع است. همچنین، به منظور استفاده از کلاس انتزاعی Car
، چند کلاس فرزند با نامهای Telsa
، Suzuki
، Duster
و Renault
ساخته شدهاند که از کلاس ارثبری میکنند. در هر یک از این کلاسها بدنه متد mileage
با دستورات متفاوت تعریف میشوند. خروجی قطعه کد فوق در ادامه ملاحظه میشود:
The mileage is 30kmph The mileage is 27kmph The mileage is 25kmph The mileage is 24kmph
چندریختی در برنامه نویسی
«چندریختی | پلی مورفیسم» (Polymorphism) یکی از اصول مهم برنامه نویسی شیگرایی است و به وضعیتی اتلاق میشود که ماهیتی نظیر متد، «عملگر» (Operator) یا شی در شرایط مختلف، رفتار متفاوتی داشته باشند.
به منظور درک بهتر این مفهوم میتوان از مثال ملموسی در دنیای واقعی استفاده کرد. میتوان شخصی را در نظر گرفت که دارای جایگاههای مختلف اجتماعی است. به عبارتی، این فرد به دلیل داشتن فرزند، رابطه پدری و همچنین رابطه همسری با فرزند و همسر خود دارد.
همچنین، این شخص دارای یک خواهر است و بدینترتیب رابطه برادری با خواهر خود و رابطه فرزندی با والدین خود دارد. بهعلاوه، این شخص کارمند شرکتی است که با همتیمیهای خود رابطه همکار دارد. بدینترتیب، این شخص در شرایط مختلف و در رابطه با اطرافیان خود، دارای جایگاه اجتماعی منحصربفردی است. به این حالت، چندریختی یا پلی مورفیسم گفته میشود.
اصل چندریختی دارای مزیتهای مختلفی است که در ادامه به مهمترین آنها اشاره شده است:
- اصل چندریختی مانع نوشتن کدهای تکراری میشود و میتوان از قطعه کدهای نوشته شده به دفعات استفاده کرد.
- اصل پلی مورفیسم باعث میشود خطایابی قطعه کدها راحتتر انجام شود.
- با استفاده از اصل چندریختی میتوان از متغیرهای تعریف شده برای ذخیرهسازی دادهها با نوع داده مختلف استفاده کرد.
از اصل چندریختی میتوان در بخشهای مختلف برنامه نویسی استفاده کرد. در این بخش، صرفاً به کاربرد این اصل در نوشتن کلاس در پایتون پرداخته میشود.
چندریختی کلاس در زبان برنامه نویسی پایتون
زبان برنامه نویسی پایتون به کاربران این اجازه را میدهد که در کلاسهای تعریف شده، متدهایی با نامهای یکسان ایجاد کنند. در این حالت، میتوان از هر شی ساخته شده به منظور دسترسی به متدهایی با نام مشابه استفاده کرد. در ادامه، مثالی از نحوه کاربرد اصل چندریختی در ایجاد کلاس در پایتون ملاحظه میشود.
class Tiger():
def nature(self):
print('I am a Tiger and I am dangerous.')
def color(self):
print('Tigers are orange with black strips')
class Elephant():
def nature(self):
print('I am an Elephant and I am calm and harmless')
def color(self):
print('Elephants are grayish black')
obj1 = Tiger()
obj2 = Elephant()
for animal in (obj1, obj2): # creating a loop to iterate through the obj1 and obj2
animal.nature()
animal.color()
بر اساس قطعه کد فوق، دو کلاس با نامهای Tiger
و Elephant
ایجاد شدهاند که هر دو کلاس دارای متدهای nature
و color
هستند. با ساخت دو شی obj1
و obj2
از دو کلاس Tiger
و Elephant
، میتوان با استفاده از یک حلقه for
، متدهای هر یک از دو کلاس را فراخوانی کرد. به عبارتی، اصل چندریختی این امکان را فراهم میکند تا با نوشتن قطعه کد کمتر، به متدهای هر دو کلاس دسترسی داشت. خروجی قطعه کد فوق در ادامه ملاحظه میشود:
I am a Tiger and I am dangerous. Tigers are orange with black strips I am an Elephant and I am calm and harmless Elephants are grayish black
رابطه چندریختی و وراثت در پایتون (بازنویسی متد)
اصل چندریختی با مفهوم وراثت رابطه بسیار نزدیکی دارد. در زبان پایتون زمانی که کلاس فرزندی از کلاس والد ارثبری میکند، تمامی مشخصههای کلاس والد در کلاس فرزند قابل دسترس هستند.
گاهی نیاز است در کلاس فرزند، متدی همنام با متد کلاس والد ایجاد شود به طوری که این متد شامل دستوراتی مغایر با دستورات متد کلاس والد باشد. به چنین حالتی، «بازنویسی متد» (Method Overriding) گفته میشود که اصل چندریختی این امکان را برای کلاس فراهم کرده است. در ادامه، مثالی از نحوه کاربرد اصل چندریختی و مفهوم بازنویسی متد ارائه شده است.
class Vehicle:
def __init__(self, brand, model, price):
self.brand = brand
self.model = model
self.price = price
def show(self):
print('Details:', self.brand, self.model, 'Price:', self.price)
def max_speed(self):
print('Vehicle max speed is 160')
def gear_system(self):
print('Vehicle has 6 shifter gearbox')
# inherit from vehicle class
class Car(Vehicle):
def max_speed(self):
print('Car max speed is 260')
def gear_system(self):
print('Car has Automatic Transmission')
# Car Object
car = Car('Audi', 'R8', 9000000)
car.show()
# call methods from Car class
car.max_speed()
car.gear_system()
# Vehicle Object
vehicle = Vehicle('Nissan', 'Magnite', 550000)
vehicle.show()
# call method from a Vehicle class
vehicle.max_speed()
vehicle.gear_system()
در مثال فوق، دو کلاس Car
و Vehicle
ایجاد شدهاند که کلاس Vehicle
به عنوان کلاس والد برای کلاس Car
محسوب میشود. کلاس Car
به عنوان کلاس فرزند، دو متد با نامهای max_speed
و gear_system
دارد که این متدها همنام با دو متد موجود در کلاس والد هستند. زمانی که با استفاده از شی car
که نمونهای از کلاس فرزند Car
است، متدهای max_speed
و gear_system
فراخوانی میشوند، بر اساس اصل چندریختی، این دو متد از کلاس Car
صدا زده شده و دیگر دستورات متدهای کلاس والد Vehicle
اجرا نمیشوند. خروجی قطعه کد فوق بهصورت زیر است:
Details: Audi R8 Price: 9000000 Car max speed is 260 Car has Automatic Transmission Details: Nissan Magnite Price: 550000 Vehicle max speed is 160 Vehicle has 6 shifter gearbox
چندریختی زمان کامپایل (سربارگذاری متد)
«سربارگذاری متد» (Method Overloading) زمانی رخ میدهد که کلاس دارای چندین متد با نامهای یکسان باشد. این متدهای همنام در نوع و تعداد آرگومان با یکدیگر مغایرت دارند. در این حالت، روال فراخوانی متدهای همنام، در زمان کامپایل برنامه انجام میشود.
زبان برنامه نویسی پایتون از سربارگذاری متد و چندریختی زمان کامپایل پشتیبانی نمیکند. با این حال، میتوان مثالی از پایتون ارائه کرد که به نوعی این وضعیت را نشان میدهد:
class Example:
def multiply(self,a,b,c=1):
print(a*b*c)
example=Example()
example.multiply(5,10)
example.multiply(2,5,6)
در مثال فوق ملاحظه میشود که متد multiply
میتواند از شیهایی با دو یا سه پارامتر به منظور محاسبه حاصل ضرب پارامترها پشتیبانی کند. خروجی قطعه کد فوق به صورت زیر است:
50 60
فرا کلاس در زبان برنامه نویسی پایتون چیست ؟
در زبان برنامه نویسی پایتون میتوان با استفاده از تابع type()
نوع هر ماهیتی نظیر متغیر، کلاس، شی و ساختار داده را تشخیص داد. در مثال زیر، نحوه کاربرد تابع به منظور تعیین نوع دادههای مختلف ملاحظه میشود.
num = 23
print("Type of num is:", type(num))
lst = [1, 2, 4]
print("Type of lst is:", type(lst))
name = "Atul"
print("Type of name is:", type(name))
خروجی قطعه کد فوق بهصورت زیر است:
Type of num is:Type of lst is: Type of name is:
بر اساس خروجیهای حاصل شده در بالا، میتوان گفت که هر ماهیتی در زبان برنامه نویسی پایتون، از کلاس ساخته شده است. در زبانهایی نظیر C++ و جاوا، عبارات «عدد صحیح» (Int)، «عدد اعشاری» (Float) و «کاراکتر» (Char) صرفاً نوع داده را مشخص میکنند در حالی که در زبان پایتون، انواع داده به عنوان اشیایی محسوب میشوند که از کلاسهای Int و Str ساخته شدهاند. بدینترتیب، در پایتون میتوان برای نوع داده جدید، کلاس جدیدی ایجاد کرد و از آن کلاس، شی جدیدی برای تعریف نوع داده جدید ساخت. به عنوان مثال، در قطعه کد زیر شیئی با نام stu_obj
از کلاس Student
ساخته شده است که با دستور type(stu_obj)
میتوان نوع داده شی را ملاحظه کرد.
class Student:
pass
stu_obj = Student()
# Print type of object of Student class
print("Type of stu_obj is:", type(stu_obj))
بر اساس خروجی قطعه کد فوق، نوع داده شی، کلاسی است که از آن ساخته میشود. در مثال فوق، نوع داد شی stu_obj
، کلاس Student
است.
Type of stu_obj is:
هر ماهیتی نظیر ساختار دادهها، کلاس، متغیرها و سایر موارد در زبان پایتون، به عنوان شی محسوب میشوند. بدینترتیب، کلاسها نیز خودشان به عنوان شیئی از یک کلاس دیگر هستند که به آن کلاس، «فرا کلاس | متا کلاس» (Metaclass) گفته میشود. در زبان پایتون، فرا کلاس، کلاس type
است که تمامی کلاسهای پایتون از این کلاس ساخته میشوند. در قطعه کد زیر، از دستور type()
به منظور تعیین نوع کلاس Student
استفاده شده است:
class Student:
pass
# Print type of Student class
print("Type of Student class is:", type(Student))
همانطور که در خروجی زیر ملاحظه میشود، نوع کلاس Student
، کلاس type
است و کلاس Student
به عنوان شیئی از کلاس type
محسوب میشود.
Type of Student class is:
نوع تمامی کلاسهای توکار زبان پایتون نیز از نوع کلاس type
هستند. در ادامه، مثالی از خروجی نوع کلاسهای توکار پایتون ملاحظه میشود:
for t in int, float, dict, list, tuple:
print(type(t))
خروجی قطعه کد فوق در زیر آمده است:
برای معین کردن نوع کلاس type
نیز، میتوان از قطعه کد زیر استفاده کرد:
print(type(type))
خروجی قطعه کد فوق در ادامه ملاحظه میشود:
بدینترتیب، میتوان نتیجهگیریهای فوق را به شکل زیر خلاصهسازی کرد:
- هر ماهیتی در زبان پایتون به عنوان شی تلقی میشود.
- شی، نمونهای از کلاس است.
- کلاس در پایتون به عنوان شی محسوب میشود.
- شی کلاس، نمونهای از فرا کلاس type
است.
- کلاس type
نیز شیئی از کلاس خودش است.
- کلاس type
فرا کلاس تمام کلاسهای پایتون است. به عبارتی، تمامی کلاسهای پایتون از فرا کلاس ساخته میشوند.
فرا کلاس مشخص میکند که کلاسهای ساخته شده از آن، چه رفتاری داشته باشند. به عنوان مثال، میتوان در فرا کلاس قطعه کدی نوشت که بر اساس آن، هر کلاس فرزندی که از آن ساخته میشود، فقط دارای یک شی باشد. اعمال چنین محدودیتی برای دسترسی به پایگاه داده یا اطلاعات حساس حائز اهمیت است و به منظور کنترل دسترسی و بررسی سطح امنیت، میتوان ساخت اشیای کلاسهای فرزند را محدود به یک شی کرد.
ساخت فرا کلاس در زبان برنامه نویسی پایتون
در زبان برنامه نویسی پایتون با استفاده از کلمه کلیدی metaclass
در قسمت اعلان کلاس، میتوان فرا کلاسی برای آن کلاس ایجاد کرد. در مثال زیر، نحوه تعریف متا کلاس با نام MyMeta
ملاحظه میشود. به منظور تعریف فرا کلاس، باید در قسمت اعلان کلاس، از کلمه type
استفاده کرد تا این متا کلاس از کلاس type
ساخته شود. کلاس MyClass
نیز کلاسی است که از فرا کلاس MyMeta
ساخته شده است که کلاس MySubclass
از آن ارثبری میکند.
class MyMeta(type):
pass
class MyClass(metaclass=MyMeta):
pass
class MySubclass(MyClass):
pass
print(type(MyMeta))
print(type(MyClass))
print(type(MySubclass))
خروجی قطعه کد فوق، در ادامه ملاحظه میشود:
به منظور ساخت فرا کلاسی که از کلاس type
ساخته میشود، میتوان سه متد فهرست شده در زیر را نیز درون فرا کلاس بازنویسی کرد:
- متد __new__
: این متد، پیش از اجرا شدن متد __init__
فراخوانده میشود و شی کلاس را میسازد و سپس آن را بازمیگرداند. میتوان نحوه ساخت شی را با استفاده از این متد تغییر داد.
- متد __init__
: میتوان از این متد به منظور مقداردهی اولیه ویژگیهای کلاس با استفاده از پارامترهای شی ساخته شده استفاده کرد.
- متد __call__
: دستورات این متد زمانی اجرا میشوند که کلاس فراخوانی شود.
جمعبندی
کلاس و شی یکی از پرکاربردترین ماهیتهای برنامه نویسی هستند که بسیاری از برنامه نویسان در پروژههای خود از آنها استفاده میکنند. قابلیتهای این دو جزء برنامه نویسی باعث شده است تا در مفاهیم شیگرایی نیز از آنها استفاده شود. پایتون به عنوان یکی از زبانهای برنامه نویسی شیگرا، از کلاس به منظور پیادهسازی اصول شیگرایی استفاده میکند. در مطلب حاضر، سعی بر این بود تا به ارائه مفهوم کاملی از کلاس، اجزا و مفاهیم مرتبط با آن و نحوه ساخت و استفاده از آن در زبان برنامه نویسی پایتون پرداخته و با ذکر مثالهای کاربردی، نحوه پیادهسازی اصول شیگرایی در پایتون با استفاده از کلاس ارائه شود.