در برنامه نویسی شی گرا (OOP)، یک کلاس یک طرح یا قالب است که متغیرها و روش های مشترک برای همه اشیاء از یک نوع خاص را تعریف می کند. این یک نوع داده تعریف شده توسط کاربر است که اعضای داده و توابع عضو خود را دارد که با ایجاد نمونه ای از آن کلاس قابل دسترسی و استفاده است. کلاس یک موجودیت منطقی است که گروهی از اشیاء را با خواص و رفتار مشابه نشان می دهد.از طرف دیگر، یک شی نمونه ای از یک کلاس است. شی یک موجود فیزیکی است که نمونه خاصی از یک کلاس را نشان می دهد. هنگامی که یک کلاس تعریف می شود، هیچ حافظه ای به آن تخصیص نمی یابد، اما زمانی که یک شی نمونه سازی می شود (یعنی ایجاد می شود) به آن حافظه تخصیص می یابد. یک شی می تواند چندین بار بنا بر نیاز ایجاد شود.برای نشان دادن این موضوع، اجازه دهید کلاسی به نام ماشین را در نظر بگیریم. کلاس ماشین طرحی است که متغیرها و روش های مشترک برای همه خودروها مانند رنگ، مدل و سال ساخت را تعریف می کند. یک شی از کلاس  نشان دهنده یک ماشین خاص است، مانند یک سمند سفید که در سال 1397 ساخته شده است.برای آشنایی با برنامه نویسی شی گرا در پایتون قصد داریم برنامه ای بنویسیم که اعضای یک شرکت را مدیریت کند. ابتدا با تعریف یک کلاس شروع می کنیم:

class Person:
    pass

نام این کلاس Person هست و کاملا خالی است. در واقع این ساده ترین حالت یک کلاس است.

برای اینکه یک شی از این نوع ایجاد کنیم به این شکل عمل می کنیم:

kamran=Person()

با این کد شی kamran از کلاس Person ایجاد می شود.

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

class Person:
    def __init__(self, first_name, last_name, IDnumber ):
        self.firstname=first_name
        self.lastname=last_name
        self.ID=IDnumber

متد خاص __init__ که به عنوان Constructor نیز شناخته می شود، برای مقداردهی اولیه کلاس Person با ویژگی هایی مانند نام کوچک، نام خانوادگی و شماره پرسنلی استفاده می شود.

در پایتون، پارامتر self اشاره به نمونه فعلی کلاس اشاره می کند و برای دسترسی به متغیرها و متدهای کلاس استفاده می شود. پارامتر self همیشه اولین پارامتر در هر تابع درون کلاس است.

در کلاسی که ایجاد کردیم، self در متد سازنده، __init__، برای اشاره به نمونه کلاسی که در حال ایجاد است، استفاده می شود. متد سازنده زمانی فراخوانی می شود که یک شی از کلاس ایجاد می شود و برای مقداردهی اولیه ویژگی های شی استفاده می شود. در این حالت، متد __init__ چهار پارامتر self، first_name، last_name و IDnumber را می گیرد. پارامتر self به نمونه ای از کلاس Person اشاره دارد که در حال ایجاد است، در حالی که first_name، last_name و IDnumber ویژگی های شی هستند که مقداردهی اولیه می شوند.

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

حالا می توانیم یک عضو واقعی که در شرکت کار می کند را تعریف کنیم:

kamran=Person('Kamran' , 'Hamidi' , '1257148')

به همین روش می توانیم به تعداد دلخواه عضو جدید تعریف کنیم.

برای دستیابی و نمایش مشخصات این عضو می توانیم به این صورت عمل کنیم:

print(kamran.firstname)
print(kamran.lastname)
print(kamran.ID)

نتیجه به این شکل نمایش داده می شود:

Kamran

Hamidi

1257148

اگر دستور زیر را اجرا کنیم:

print(type(kamran))

خواهیم دید که نوع شی Kamran به شکل زیر نمایش داده می شود:

<class ‘__main__.Person’>

حالا بیایید تابعی به کلاس اضافه کنیم که بتوانیم حقوق هر کارمند را مشخص کنیم. کلاس را به این صورت بازنویسی می کنیم:

class Person:
    def __init__(self, first_name, last_name, IDnumber ):
        self.firstname=first_name
        self.lastname=last_name
        self.ID=IDnumber
        self.salary = None

    def set_salary(self, salary):
        self.salary = salary

ما یک متد جدید به نام set_salary به کلاس Person اضافه کرده ایم. این متد یک پارامتر یعنی دستمزد را می گیرد و ویژگی salary شیء را به مقدار حقوق تعیین می کند. همان طور که می بینید در انتهای تابع __init__ خط زیر را اضافه کرده ایم:

        self.salary = None

مقدار آن را None گذاشته ایم و همان طور که می بینید salary به عنوان یک آرگومان ورودی در __init__ تعیین نشده است. چرا که بعد از ایجاد یک شی با فراخوانی تابع حقوق شخص را تعیین خواهیم کرد. چون که مشخصات فردی هر عضو شرکت ثابت است اما حقوق او ممکن است در آینده تغییر کند. بنابراین موقع ایجاد یک کارمند جدید لازم نیست حقوق او را مشخص کنیم. بلکه بعدا بدون اینکه مجبور باشیم این کارمند را حذف کنیم و دوباره تعریف کنیم، می توانیم حقوقش را تعیین نماییم.

نحوه مشخص کردن حقوق توسط متد set_salary را در زیر می بینید:

kamran=Person('Kamran' , 'Hamidi' , '1257148')
kamran.set_salary(70000000)

برای مشاهده حقوق این کارمند می توانیم به این طریق اقدام کنیم:

print(kamran.salary)