اگر بخواهیم با پایتون برنامه نویسی شی گرا انجام دهیم، حتماً باید نحوه ایجاد کلاس در پایتون را یاد بگیریم. در این آموزش با نحوه تعریف کلاس، متدها و ویژگیهای آن در python آشنا شده و با مثال آن را بررسی میکنیم.
برنامه نویسی شی گرا به ما کمک میکند کدهای خواناتر و نزدیکتر به دنیای واقعی بنویسیم. میدانیم که کلاسها شبیه یک قالب برای اشیاء هستند. به هر نمونه از یک کلاس (Class)، شئ (Object) گفته میشود.
هر کلاس میتواند ویژگیهای مختلفی داشته باشد. به این ویژگیها state یا attribute گفته میشود. همچنین هر شی میتواند رفتارهایی از خودش نشان دهد؛ این رفتارها در کلاس با عنوان متد (method) تعریف میشوند.
برای مثال، هر کدام از ما یک نمونه (شی) از کلاس انسان هستیم. هر کدام ویژگیهای منحصر به خودمان را داریم. از رنگ پوست و ملیت گرفته تا قد، وزن و سن. همچنین همگی میتوانیم کارهایی را انجام دهیم، مثلاً راه برویم، چیزی بخوریم یا حرف بزنیم.
بر مبنای همین مثال، در ادامهی آموزش یک کلاس ساده از انسان را در پایتون پیادهسازی میکنیم.
برای عضویت در دوره ویدئویی میتونید به «دوره جامع پایتون در کالج» مراجعه کنید. با ثبتنام رایگان در دوره، به تمام جلسات اصلی، جلسات تکمیلی، تمرینها، آزمونها و منابع مازاد دسترسی کامل خواهید داشت.
فهرست محتوای آموزش
تعریف کلاس در پایتون
فرض کنید میخواهیم کلاسی به نام Person ایجاد کنیم. این کلاس نشاندهنده موجودیت افراد در سیستم ما است.
ساختار کلی تعریف کلاس در پایتون به صورت زیر است. ابتدا کلمه کلیدی class را نوشته و سپس نام کلاس را با حرف بزرگ مینویسیم و با :
آغاز محدوده کلاس را تعیین میکنیم.
مشابه هر ساختار دیگری در پایتون، دندانه گذاری (یا فرورفتگی) کدها در ساختار کلاس دارای اهمیت است.
class Person:
# class body here...
برای تعریف توضیحات کلاس، توضیحات توصیفکننده را در خط اول بدنه به شکل یک رشته متنی مینویسیم؛ مثل کلاس زیر:
class Person:
"represent person identity"
# class body here ....
ویژگی کلاس در پایتون
ویژگیهای یک کلاس (property) وضعیت و مقادیری مرتبط با نمونههای ایجاد شده از آن کلاس را نگهداری میکند. در حقیقت این ویژگیها متغیرهایی هستند که اطلاعات مورد نیاز را در آنها قرار میدهیم.
برای اینکه یک ویژگی کلاس در پایتون را از همان ابتدا تعریف کنیم، مشابه تعریف متغیر پایتون عمل میکنیم. به این صورت که در بدنه کلاس، نام متغیر (ویژگی) را نوشته و مقداردهی میکنیم.
class Person:
name = None
nationality = "iranian"
score = 100
# some codes
البته گاهی اوقات ممکن است بنا به نیازمان، متغیری را در یکی از متدهای کلاس ایجاد کنیم. با کلمه کلیدی self که در ادامه یاد میگیریم میتوان چنین کاری انجام داد.
تعریف متدهای کلاس
متدهای کلاس در پایتون همان رفتارهای یک شی از کلاس است. برای تعریف متدها دقیقاً مشابه تعریف تابع در پایتون عمل میکنیم. یعنی پس از کلمه کلیدی def نام متد مورد نظر را نوشته و در صورت نیاز، پارامترهای ورودی آن را مشخص میکنیم.
در قطع کد زیر، من یک متد به نام say_hello()
تعریف کردم که «سلام» در خروجی چاپ میکند.
class Person:
name = None
score = 100
def say_hello(self):
print( "Hello!" )
دقت کنید که برای تعریف متدها در کلاسهای پایتون، میبایست حداقل یک آرگومان ورودی که معمولاً به نام self
تعریف میشود برای آن در نظر گرفت.
متغیر self در پایتون
برای اینکه در متدهای کلاس به ویژگیهای همان شئ دسترسی داشته باشیم، از self استفاده میکنیم. این مقدار به همان شئ ما اشاره کرده و میتوانیم مشابه یک شئ با آن رفتار کنیم.
در قطعه کلاس زیر، متد set_name()
را تعریف کردهایم. این متد یک ورودی از کاربر میگیرد و ویژگی name شئ را تغییر میدهد.
class Person:
name = None
score = 100
def set_name(self, name):
self.name = name
در بدنه متدهای کلاس پایتون میتوانیم پردازشهای مورد نظرمان را انجام دهیم. اجازه دهید کلاس بالا را کمی تغییر دهم. میخواهم وقتی متد set_name()
صدا زده شد، اگر نام کاربر None بود، تغییر نام انجام شود، در غیر اینصورت خطایی در خروجی چاپ کنم. (شرط در پایتون)
class Person:
name = None
score = 100
def set_name(self, name):
if name == None:
self.name = name
else:
print("You Cann't Change name Attribute!")
استفاده از کلاس در پایتون
حال که یک کلاس ساده ساختیم، میتوانیم از آن شئ (object) ایجاد کنیم. وقتی یک شی ساخته میشود، دارای id منحصر به فرد در حافظه کامپیوتر خواهد شد. بنابراین همه اشیاء از یکدیگر متمایز بوده و ویژگیهایشان با یکدیگر متفاوت است.
ساخت شی از کلاس
برای ساخت شئ از کلاس در پایتون فقط کافی است نام کلاس را به صورت یک تابع بنویسیم. مثلاً برای ساخت یک شی جدید از کلاس Person به شکل زیر عمل میکنیم:
user = Person()
با این کار، مقداری در متغیر user ذخیره میشود که به کمک آن میتوانیم به متدها و ویژگیهای شئ دسترسی داشته باشیم. اگر type()
این شئ را بررسی کنیم، نتیجهای مشابه تصویر زیر به ما برگردانده میشود:
با گذاشتن نقطه (.
) بعد از نام شئ، میتوانیم متدها و ویژگیهای آن را فراخوانی کرده و استفاده کنیم. در قطعه کدهای زیر، پس از ساخت یک نمونه از کلاس Person، نام آن را تعریف کرده و سپس مقدار ویژگی score او را چاپ کردهام. (پرینت در پایتون)
user = Person()
user.set_name("Omid")
print( user.score )
سازنده __init__ در پایتون
زمانی که میخواهیم یک شئ از کلاس در پایتون ایجاد کنیم، یک متد فراخوانی میشود. به این متد constructor یا سازنده گفته میشود. وقتی Person()
را فراخوانی میکنیم، در حقیقت داریم متد سازنده کلاس Person را اجرا میکنیم.
اگر برای کلاسی متد سازنده تعریف نشود، مشکلی وجود ندارد. اما معمولاً از این متد برای کارهای اولیه ساخت شی از کلاس (مثل مقداردهی اولیه ویژگیها) استفاده میشود.
برای تعریف متد سازنده کلاس در پایتون به شکل زیر عمل میکنیم. سازنده زیر، سادهترین سازنده کلاس است.
ما میتوانیم برای متد __init__
آرگومانهای ورودی تعریف کنیم. مثلاً در کلاس زیر، نام و نام خانوادگی کاربر را در هنگام ساخته شدن object تنظیم میکنم.
class Person:
name = None
score = 100
def __init__(self, name, family):
self.name = name
self.family = family
def say_hello(self):
print("Hello", self.name)
میبینید که به کمک self میتوانیم متغیرهایی که از قبل در کلاس تعریف نشدهاند (مثل family
) را تعریف و مقداردهی کنیم. پس از مقداردهی، این متغیر در کل کلاس پایتون در دسترس خواهد بود.
وقتی بخواهیم یک شئ از این کلاس بسازیم، باید آرگومانهای ورودی آن را نیز تعیین کنیم. بنابراین برای ساخت object از کلاس بالا باید مشابه زیر عمل کرد:
user = Person("Omid", "Rajaei")
user.say_hello()
در این آموزش به نحوه تعریف کلاس در پایتون پرداختیم. اگر مایلید مثالهای بیشتری از کلاسهای پایتون ببینید، به مستندات آن مراجعه کنید.
پیشنهاد میکنم همین الآن چند کلاس برای خود نوشته و چند ویژگی و متد برای آنها تعریف کنید تا نحوه تعریف و کار با کلاسها را کاملاً به خاطر بسپارید.
این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش پایتون
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام وقت به خیر
من کدنویسی حرفه ای پایتون انجام میدم. یکی از گیج کننده ترین مباحث برنامه نویسی شی گرا همین موضوع تعریف کلاس و شی هست.
برام جالب بود که موضوع کلاس و شی رو اینقد ساده توضیح دادید و جا انداختید.
تشکر از اینکه علم تون رو با بقیه به اشتراک میگذارید.
سلام محسن عزیز
ممنون بابت لطفت. خوشحالیم که میتونیم در مسیر یادگیری علاقهمندها تأثیری داشته باشیم 🙂
سلام خسته نباشید
با چه module ای میشه در کلاس isAccessible بودن idرو تشخیص داد
یعنی ببینیم id در دسترس هست یانه
سلام
منظورتون رو متوجه نشدم! در دسترس بودن id رو میشه با مثال توضیح بدید؟
سلام و درود
ببخشبد من نمیدونم چرا هرکاری میکنم درست init و self رو انگار متوجه نمیشم😔
نمیدونم چرا امکانش هست کمک بفرمایید
کلا توی مباحث جدید یادگرفتن این مشکلو دارم علتش چیه؟🙏
سلام
ابتدا یه توضیح مختصر بدم؛ init یه متد در کلاسه که وقتی از کلاس یه شیء جدید ایجاد میکنیم فراخوان و اجرا میشه.
self شبیه به متغیره که در تمام متدهای کلاس وجود داره و به خودِ شیء اشاره میکنه. مثلاً من دو تا شیء از کلاس person ایجاد میکنم (p1 و p2) وقتی توی یکی از متدهای این کلاس self رو استفاده میکنیم منظورمون همون شیء (p1 یا p2) هست. مثلاً درون
p1.test()
به یک ویژگی (مثلاً نمره اون فرد) در همون شیء دسترسی پیدا میکنیم.برای یادگیری هم، پیشنهادی که دارم اینه که سعی کنید مباحث جدید رو با مباحث قبلی ربط بدید یا برای خودتون به یک چیزی در دنیای واقعی یا چیزی که بهش مسلط هستید بدید. مثلاً من توی آموزشها سعی میکنم از دنیای پیرامون مثال بزنم تا دانشپذیر بتونه راحتتر این فضا رو تطبیق بده با چیزهایی که باهاشون آشناست.
نکته مهمتر هم تمرینه! تمرین کردن خیلی مهمه؛ اینطوری هم موضوع رو بهتر درک میکنید و هم در ذهنتون بهتر میمونه. کاری که سعی میکنیم توی دورههای کالج (مثل دوره رایگان مکمل پایتون و دستگرمی با پایتون) انجام بدیم…
🙏🙏
بستن کلاس چطوری هستش با چی بسته میشه
بستن نداره! در پایتون محدودهها رو با تورفتگی در کد مشخص میکنیم.
سلام من یک کلاس ساختم که مشابه ساختمان داده درخته ،یک کلاسم مشابه لیست پیوندی
میخواستم هر نود درخت اشاره کنه به یک لیست پیوندی
چکار باید کنم ؟
سلام
کافیه نوع دادهای هر نود درخت شما یک شیء از کلاس لیست پیوندی باشه. به نوعی توی درخت چندین شیء از نوع لیست پیوندی خواهید داشت.
ببخشید None که بعد از name گذاشتید به چه معناست در پایتون؟ و قسمت های قبلی که زمان بود و فرمت گذاشتید
%H %M % t به چه معنان؟
ممنون میشم جواب بدید
مرسی از سایت خوبتون
None یه نوع دادهایه به معنی هیچی! مثلاً به جای اینکه یه رشته خالی تعریفش کنیم (
""
) میگیم این متغیر هنوز هیچی درون خودش نداره.اون حروف نشوندهنده یه حالت از زمانن. مثلاً H ساعت رو به صورت ۲۴ ساعتی (۱۳ ۱۴ و…) نشون میده. توی همون جلسه یه لینک به جدول نمادها در مستندات پایتون گذاشتم که میتونید حروف مختلف و مثالی ازشون رو ببینید.
خیلی خوب و قابل فهم بود. دستتون درد نکنه
خوشحالیم که این آموزش براتون کاربردی و قابل فهم بوده 🙂 موفق باشی
سلام خسته نباشید. بنده میخواستم یک سوالی درمورد همین مبحث کلاس بپرسم.
آیا استفاده از کلاس برای موارد خاصی هستش یا میشه بجای استفاده از کلاس از راه های دیگه استفاده کرد که کد خودمون رو بنویسیم؟
سلام
اگه منظورتون نوشتن یک برنامه از صفره،
در رویههای برنامهنویسی، ما دو حالت کلی رو در نظر میگیریم؛ یکی functional و دیگری object-oriented. اولی اینطوره که کدها رو همینطوری در یه فایل بنویسیم و نهایتاً تابع داشته باشیم. در شیءگرایی سعی میکنیم تمام ساختارمون از اصول شیءگرا و بحث کلاسها تبعیت کنند.
دقیقاً مشابه کاری که توی دوره دستگرمی با پایتون انجام میدیم. یکسری پروژه بدون نوشتن کلاس و ورود به بحث شیءگرایی پیادهسازی میشن ولی یکی دو مورد رو با کلاسها مینویسیم.
dar ebteda neveshtin name class bozorg neveshte mishavad dar soorati ke “Person” ra dar block aval ba harfe koochik neveshte id.
dar blocke sevom bejaye Person neveshte id “Persion”
in mitavanad kami gij konande bashad
mamnoon
ممنون که بهمون گفتی امین عزیز. هر دو مورد اصلاح شد.
سلام ممنون میشیم تو این حل این سوال کمکم کنید :
برنامه ای بنویسید که از کلاسی به نام tirangle استفاده کند.
این کلاس دارای خصوصیات base و height است که مقادیر آن به وسیله تابع سازنده مقداردهی می شود. تابع عضو ()calculate مساحت مثلث را محاسبه می کند و برمیگرداند.
سلام
در کدوم قسمتش مشکل دارید؟ تابع سازنده که همون
__init__
هست و باید مقادیر رو بگیرید و در دو تا متغیر نگهداری کنید. یه متد هم برای محاسبه مساحت بنویسید. جلسه توابع در دوره جامع رو حتماً ببینید.سایتتون خیلی خوبه.
همه چی رو ساده و جمع و جور و شسته رُفته توضیح دادین و همین ویژگی منحصر به فردتون کرده.
موفق باشین 🙂❤️
ممنون امید عزیز
خوشحالیم که آموزشهامون رو ساده و خوب میدونین.
یه خبر: تقریباً ده روز دیگه فیلمهای دوره مکمل با پروژه پایتونی توی سایت منتشر میشه. اگه دوست داشتین دوباره بهمون سر بزنین یا توی اینستاگراممون پیگیر باشین 🙂
تشکر از شما، استفاده کردیم.
بسم الله الرحمن الرحیم
تشکر فراوان بابت این آموزش عالی
خوشحالیم که این آموزش رو مفید میدونید و درحال یادگیری برنامهنویسی هستید احمد عزیز.
خیلی عالی
سایت حرفه ای و با مطالب عالی و ساده!
ممنون از وقت با ارزشی که می گذارید
لطف داری امیرمحمد عزیز.
ممنونم به خاطر انرژی خوبی که بهمون دادی. موفق باشی 🙂
خیلی ممنون
سلامت و موفق باشی نیمای عزیز
مثل همیشه عالی
دستتون درد نکنه
سلامت باشی محمدرضای عزیز 🙂