برنامه نویسی و طراحی سایت

کلاس در پایتون چیست؟ — آموزش کامل ساخت و استفاده + کد و مثال

کلاس در پایتون چیست؟ — آموزش کامل ساخت و استفاده + کد و مثال

«کلاس» (Class) یکی از مهم‌ترین و پرکاربردترین مفاهیم در برنامه نویسی محسوب می‌شود. کلاس بستری را فراهم می‌کند تا داده‌ها و توابع در کنار یکدیگر قرار بگیرند که همین امر در بهتر شدن کدنویسی به‌صورت سازمان‌یافته نقش به‌سزایی دارد. کلاس در پایتون به عنوان یکی از اساسی‌ترین مفاهیم این زبان تلقی می‌شود، زیرا تمامی ماهیت‌های این زبان برنامه نویسی بر پایه مفهوم کلاس بنا شده‌اند. همچنین، زبان پایتون جزء زبان‌های برنامه نویسی شی‌گرا به شمار می‌رود که از کلاس، به عنوان مهم‌ترین عنصر شی گرایی، به منظور پیاده‌سازی اصول آن استفاده می‌کند.

فهرست مطالب این نوشته
مفهوم شی در زبان برنامه نویسی پایتون چیست ؟

مفهوم کلاس در زبان پایتون چیست ؟

مزایای استفاده از کلاس در برنامه نویسی پایتون چیست ؟

نحوه ساخت کلاس در زبان پایتون چگونه است ؟

نحوه تعریف کلاس در زبان پایتون با استفاده از تابع Type()‎

نحوه استفاده از کلاس در زبان پایتون چگونه است ؟

انواع ویژگی های کلاس در زبان برنامه نویسی پایتون چیست ؟

متغیرهای نمونه و متغیرهای کلاس

ویژگی های توکار کلاس در زبان پایتون چیست ؟

ویژگی __dict__ شی در پایتون

ویژگی __doc__ شی در پایتون

ویژگی __name__ شی در پایتون

ویژگی __module__ شی در پایتون

ویژگی __bases__ شی در پایتون

تغییر ویژگی های کلاس و حذف شی در پایتون

معرفی فیلم های آموزش پایتون

انواع متدهای کلاس در زبان پایتون چیست ؟

متد نمونه در کلاس های پایتون

پارامتر self در کلاس پایتون چیست ؟

متد کلاس در زبان پایتون

تعریف متد کلاس با استفاده از دکوراتور

تعریف متد کلاس با استفاده از تابع Classmethod

پارامتر cls در کلاس پایتون چیست ؟

متد ایستا در کلاس پایتون

تعریف متد ایستا با استفاده از دکوراتور

تعریف متد ایستا با استفاده از تابع Staticmethod

متدهای خاص کلاس در زبان پایتون

تابع __init__ پایتون در کلاس

تابع __str__ در کلاس پایتون

تابع __len__ در کلاس پایتون

تابع __eq__ در کلاس پایتون

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

کلاس انتزاعی در پایتون

کلاس عینی در پایتون

کلاس جزئی در پایتون

کاربرد دستور Pass در پایتون برای ساخت کلاس چیست ؟

پیاده سازی شی گرایی با کلاس در زبان برنامه نویسی پایتون

ارث بری کلاس در پایتون

وراثت منفرد در پایتون

وراثت چندگانه در پایتون

وراثت چندسطحی در پایتون

وراثت سلسله مراتبی در پایتون

وراثت ترکیبی در زبان پایتون

متد super کلاس در پایتون

کپسوله سازی کلاس در زبان برنامه نویسی پایتون چیست ؟

ساخت متد خصوصی در پایتون

ساخت ویژگی خصوصی در پایتون

انتزاع در کلاس پایتون

چندریختی در برنامه نویسی

چندریختی کلاس در زبان برنامه نویسی پایتون

رابطه چندریختی و وراثت در پایتون (بازنویسی متد)

چندریختی زمان کامپایل (سربارگذاری متد)

فرا کلاس در زبان برنامه نویسی پایتون چیست ؟

ساخت فرا کلاس در زبان برنامه نویسی پایتون

جمع‌بندی

faradars mobile

در مطلب حاضر، سعی بر این است تا آموزش جامعی از مفهوم کلاس و اجزای اصلی آن، نحوه پیاده‌سازی و استفاده از آن در زبان پایتون ارائه شود. به‌علاوه، در این مقاله، با ارائه مثال‌های کاربردی از زبان برنامه نویسی پایتون به نحوه پیاده‌سازی اصول شی‌گرایی با استفاده از کلاس پرداخته می‌شود.

مفهوم شی در زبان برنامه نویسی پایتون چیست ؟

زبان برنامه نویسی پایتون به عنوان یکی از زبان‌های برنامه نویسی شی گرا محسوب می‌شود. یکی از اجزای اصلی مفهوم شی‌گرایی، «شی» (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__

در بخش‌های بعدی مطلب حاضر، به توضیح کاربرد هر یک از ویژگی‌های توکار ذکر شده‌ی بالا به همراه مثال پرداخته می‌شود.

آموزش برنامه نویسی پایتون Python – مقدماتی
فیلم آموزش برنامه نویسی پایتون Python – مقدماتی در تم آف

کلیک کنید

ویژگی __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)

در ادامه مطلب حاضر به توضیح هر یک از انواع متدهای کلاس در زبان برنامه نویسی پایتون پرداخته می‌شود.

آموزش برنامه نویسی پایتون پیشرفته – ترفندهای Python
فیلم آموزش برنامه نویسی پایتون پیشرفته – ترفندهای Python در تم آف

کلیک کنید

متد نمونه در کلاس های پایتون

متد نمونه در کلاس پایتون مجموعه‌ای از عملیات را بر روی متغیرهای نمونه کلاس اعمال می‌کند. به‌طور پیش‌فرض، هر متدی که درون کلاس ایجاد می‌شود، به‌طور خودکار پایتون آن را به عنوان متد نمونه در نظر می‌گیرد. در قطعه کد زیر، مثالی از نحوه ساخت متد نمونه در کلاس پایتون ملاحظه می‌شود. در این مثال، متد 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()

استفاده می‌شود که در ادامه، به توضیح هر دو روش ذکر شده به همراه مثال پرداخته می‌شود.

آموزش برنامه نویسی پایتون Python – مقدماتی
فیلم آموزش برنامه نویسی پایتون Python – مقدماتی در تم آف

کلیک کنید

تعریف متد کلاس با استفاده از دکوراتور

به منظور ساخت متد کلاس در پایتون، می‌توان پیش از اعلان متد از دکوراتور @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)

در ادامه، به نحوه استفاده از کلاس در پیاده‌سازی این چهار اصل شی‌گرایی پرداخته می‌شود.

آموزش برنامه نویسی شی گرا در پایتون Python
فیلم آموزش برنامه نویسی شی گرا در پایتون Python در تم آف

کلیک کنید

ارث بری کلاس در پایتون

بر اساس اصل وراثت، یک کلاس می‌تواند به عنوان «کلاس فرزند | زیر کلاس» (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) در پایتون

فرا کلاس مشخص می‌کند که کلاس‌های ساخته شده از آن، چه رفتاری داشته باشند. به عنوان مثال، می‌توان در فرا کلاس قطعه کدی نوشت که بر اساس آن، هر کلاس فرزندی که از آن ساخته می‌شود، فقط دارای یک شی باشد. اعمال چنین محدودیتی برای دسترسی به پایگاه داده یا اطلاعات حساس حائز اهمیت است و به منظور کنترل دسترسی و بررسی سطح امنیت، می‌توان ساخت اشیای کلاس‌های فرزند را محدود به یک شی کرد.

ساخت فرا کلاس در زبان برنامه نویسی پایتون

در زبان برنامه نویسی پایتون با استفاده از کلمه کلیدی 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__

    : دستورات این متد زمانی اجرا می‌شوند که کلاس فراخوانی شود.

آموزش برنامه نویسی متا Metaprogramming در پایتون
فیلم آموزش برنامه نویسی متا Metaprogramming در پایتون در تم آف

کلیک کنید

جمع‌بندی

کلاس و شی یکی از پرکاربردترین ماهیت‌های برنامه نویسی هستند که بسیاری از برنامه نویسان در پروژه‌های خود از آن‌ها استفاده می‌کنند. قابلیت‌های این دو جزء برنامه نویسی باعث شده است تا در مفاهیم شی‌گرایی نیز از آن‌ها استفاده شود. پایتون به عنوان یکی از زبان‌های برنامه نویسی شی‌گرا، از کلاس به منظور پیاده‌سازی اصول شی‌گرایی استفاده می‌کند. در مطلب حاضر، سعی بر این بود تا به ارائه مفهوم کاملی از کلاس، اجزا و مفاهیم مرتبط با آن و نحوه ساخت و استفاده از آن در زبان برنامه نویسی پایتون پرداخته و با ذکر مثال‌های کاربردی، نحوه پیاده‌سازی اصول شی‌گرایی در پایتون با استفاده از کلاس ارائه شود.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.