دیتابیس Database و مدل Model در Django
دیتابیس Database و مدل Model در جنگو از درس قبل به خاطر دارید که آطلاعات دورهها به صورت ثابت داخل
تا اینجا با متغیرها، شرطها، حلقهها، توابع و ساختارهای داده در پایتون آشنا شدیم. اما زمانی که برنامهها بزرگتر و پیچیدهتر میشوند، نوشتن کد به روش معمول دشوار خواهد شد. در چنین شرایطی، برنامهنویسی شیءگرا (Object-Oriented Programming یا OOP) به ما کمک میکند کدهای خود را منظمتر، قابل نگهداریتر و قابل استفاده مجدد بنویسیم.
در برنامهنویسی شیءگرا، به جای اینکه فقط روی توابع تمرکز کنیم، برنامه را به مجموعهای از اشیاء (Objects) تقسیم میکنیم. هر شیء دارای ویژگیها (اطلاعات) و رفتارها (عملیات) است. این روش امروزه یکی از مهمترین شیوههای برنامهنویسی در زبانهایی مانند Python، Java و C# محسوب میشود.
در این آموزش یاد میگیریم چگونه کلاس بسازیم، از روی آن شیء ایجاد کنیم و برای هر شیء ویژگیها و متدهای مخصوص به خود را تعریف کنیم.
فرض کنید میخواهیم اطلاعات چند دانشآموز را در برنامه ذخیره کنیم. اگر برای هر دانشآموز چندین متغیر جداگانه تعریف کنیم، برنامه خیلی سریع شلوغ و مدیریت آن سخت میشود. راه بهتر این است که یک الگو برای دانشآموز تعریف کنیم و سپس هر دانشآموز را بر اساس همان الگو بسازیم. به این الگو کلاس (Class) میگوییم و هر نمونهای که از آن ساخته میشود یک شیء (Object) نام دارد.
به بیان ساده:
فرض کنید کارخانهای خودرو تولید میکند. در این کارخانه نقشه ساخت خودرو همان کلاس (Class) است و هر خودروی تولیدشده شیء (Object) از آن کلاس؛ تمام خودروها از یک نقشه ساخته میشوند، اما هر کدام میتوانند رنگ، مدل یا شماره پلاک متفاوتی داشته باشند. همین ایده در برنامهنویسی نیز استفاده میشود.
در پایتون برای ایجاد یک کلاس از کلمه کلیدی class استفاده میکنیم. سادهترین شکل تعریف یک کلاس به صورت زیر است:
class Student:
passدر این مثال:
class کلمه کلیدی برای ایجاد کلاس است.Student نام کلاس است.pass یعنی فعلاً داخل کلاس هیچ دستوری وجود ندارد.در حال حاضر فقط یک قالب (Template) ساختهایم و هنوز هیچ شیئی از آن ایجاد نشده است.
برای ساخت یک شیء، کافی است نام کلاس را مانند یک تابع صدا بزنیم.
class Student:
pass
student1 = Student()در این برنامه ابتدا کلاس Student ساخته شده است. سپس یک شیء به نام student1 از روی این کلاس ایجاد شده است. در این لحظه، متغیر student1 یک شیء از نوع Student است.
یکی از مهمترین مزیتهای کلاس این است که میتوان از روی یک کلاس، هر تعداد شیء که بخواهیم ایجاد کنیم.
class Student:
pass
student1 = Student()
student2 = Student()
student3 = Student()اکنون سه شیء مختلف از یک کلاس ساخته شدهاند. هر سه از روی یک الگو ایجاد شدهاند، اما بعداً میتوانند اطلاعات متفاوتی داشته باشند.
فرض کنید یک قالب شیرینی قلبیشکل دارید. در این صورت قالب شیرینی همان کلاس است و هر شیرینی که با آن قالب درست میشود، معادل یک شی از آن کلاس است. شما با یک قالب میتوانید صدها شیرینی درست کنید. همه شکل مشابهی دارند، اما میتوانند رنگ، طعم یا تزئینات متفاوتی داشته باشند.
فرض کنید کلاس Car را تعریف کنیم.
class Car:
passحالا چند خودرو میسازیم.
class Car:
pass
car1 = Car()
car2 = Car()
car3 = Car()اکنون سه شیء از کلاس Car ساخته شده است. در حال حاضر این خودروها هیچ اطلاعاتی ندارند؛ نه رنگ، نه مدل و نه سرعت. در بخش بعدی یاد میگیریم چگونه برای هر شیء ویژگیهایی مانند رنگ، مدل و سال ساخت تعریف کنیم.
تا اینجا توانستیم از روی یک کلاس چند شیء ایجاد کنیم، اما این اشیاء هنوز هیچ اطلاعاتی ندارند. برای مثال اگر بخواهیم اطلاعات یک دانشآموز را ذخیره کنیم، به مواردی مانند نام، سن و معدل نیاز داریم. این اطلاعات را ویژگی (Attribute) مینامند. به عبارت دیگر، ویژگیها همان متغیرهایی هستند که متعلق به یک شیء هستند.
برای مثال، اگر کلاس Student داشته باشیم، ویژگیهای آن میتوانند شامل موارد زیر باشند:
و اگر کلاس Car داشته باشیم، ویژگیهای آن میتوانند شامل موارد زیر باشند:
میتوان بعد از ساخت شیء، ویژگیهای آن را تعریف کرد.
class Student:
pass
student1 = Student()
student1.name = "Ali"
student1.age = 18
student1.score = 19.5
print(student1.name)
print(student1.age)
print(student1.score)خروجی
Ali
18
19.5در این مثال، سه ویژگی به شیء student1 اضافه شده است.
هر شیء میتواند مقادیر مخصوص به خودش را داشته باشد.
class Student:
pass
student1 = Student()
student2 = Student()
student1.name = "Ali"
student1.age = 18
student2.name = "Sara"
student2.age = 20
print(student1.name)
print(student2.name)خروجی
Ali
Saraبا اینکه هر دو از یک کلاس ساخته شدهاند، اما اطلاعات کاملاً متفاوتی دارند.
این روش برای مثالهای ساده قابل استفاده است، اما اگر فراموش کنیم یکی از ویژگیها را برای یک شیء تعریف کنیم، برنامه با خطا مواجه میشود.
بنابراین بهتر است هنگام ساخت هر شیء، تمام ویژگیهای موردنیاز را به صورت خودکار مقداردهی کنیم. برای انجام این کار از متد سازنده (__init__) استفاده میکنیم.
متد __init__ یک متد ویژه در پایتون است که به محض ایجاد یک شیء، بهطور خودکار اجرا میشود. از این متد برای مقداردهی اولیه ویژگیهای شیء استفاده میکنیم. ساختار کلی آن به صورت زیر است:
class Student:
def __init__(self):
print("Object Created")اگر اکنون یک شیء ایجاد کنیم:
student1 = Student()خروجی
Object Createdبدون اینکه خودمان متد __init__ را فراخوانی کنیم، پایتون آن را به صورت خودکار اجرا میکند.
اگر به مثال قبلی دقت کنید، متد __init__ یک پارامتر به نام self داشت.
class Student:
def __init__(self):
print("Object Created")self به شیء جاری (Current Object) اشاره میکند؛ یعنی همان شیئی که در حال ساخته شدن یا استفاده شدن است. به کمک self میتوانیم به ویژگیها و متدهای همان شیء دسترسی داشته باشیم.
نکته: نام
selfیک قرارداد در پایتون است. از نظر فنی میتوانید نام دیگری انتخاب کنید، اما تقریباً تمام برنامهنویسان ازselfاستفاده میکنند و بهتر است شما هم همین کار را انجام دهید.
اکنون میتوانیم هنگام ساخت هر شیء، ویژگیهای آن را مقداردهی کنیم.
class Student:
def __init__(self):
self.name = "Ali"
self.age = 18
self.score = 19.5
student1 = Student()
print(student1.name)
print(student1.age)
print(student1.score)خروجی
Ali
18
19.5در این مثال self.name ویژگی نام را ایجاد میکند. self.age ویژگی سن را ایجاد میکند. و self.score ویژگی معدل را ایجاد میکند.
از این به بعد هر شیئی که ساخته شود، این سه ویژگی را خواهد داشت.
فرض کنید بخواهیم اطلاعات چند دانشآموز مختلف را ذخیره کنیم. اگر کد بالا را اجرا کنیم، همه دانشآموزان دقیقاً اطلاعات یکسانی خواهند داشت.
student1 = Student()
student2 = Student()
print(student1.name)
print(student2.name)خروجی
Ali
Aliمشخص است که این روش مناسب نیست؛ چون هر دانشآموز باید اطلاعات مخصوص به خودش را داشته باشد.
راهحل این است که هنگام ایجاد شیء، اطلاعات موردنیاز را به متد __init__ ارسال کنیم.
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
student1 = Student("Ali", 18, 19.5)
student2 = Student("Sara", 20, 18.75)
print(student1.name)
print(student2.name)خروجی
Ali
Saraدر این مثال "Ali" در متغیر name قرار میگیرد. عدد 18 در متغیر age قرار میگیرد. و عدد 19.5 در متغیر score قرار میگیرد. سپس با دستورهای زیر، این مقادیر داخل شیء ذخیره میشوند.
self.name = name
self.age = age
self.score = scoreدر این دستور:
self.name = nameسمت راست (name) مقداری است که هنگام ساخت شیء ارسال کردهایم. سمت چپ (self.name) ویژگی مربوط به همان شیء است. بنابراین این دستور یعنی: «مقدار ورودی name را داخل ویژگی name این شیء ذخیره کن.» همین اتفاق برای age و score نیز رخ میدهد.
در نتیجه اکنون هر شیء اطلاعات مخصوص به خودش را دارد.
student1 = Student("Ali", 18, 19.5)
student2 = Student("Sara", 20, 18.75)
student3 = Student("Reza", 17, 17.25)هر سه شیء از یک کلاس ساخته شدهاند، اما هر کدام نام، سن و معدل متفاوتی دارند.
تا اینجا ویژگیهای یک شیء را تعریف کردیم؛ مانند نام، سن و معدل. اما یک شیء علاوه بر اطلاعات، میتواند رفتار (Behavior) نیز داشته باشد. در برنامهنویسی شیءگرا، به توابعی که داخل یک کلاس تعریف میشوند متد (Method) میگویند. به بیان ساده:
در مثال زیر یک متد به نام show_info تعریف میکنیم که اطلاعات دانشآموز را نمایش میدهد.
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def show_info(self):
print("Name:", self.name)
print("Age:", self.age)
print("Score:", self.score)
student1 = Student("Ali", 18, 19.5)
student1.show_info()خروجی
Name: Ali
Age: 18
Score: 19.5برای اجرای یک متد، از نام شیء و سپس نام متد استفاده میکنیم.
student1.show_info()پایتون به صورت خودکار، شیء student1 را به عنوان self به متد ارسال میکند. به همین دلیل هنگام فراخوانی متد، لازم نیست خودمان self را بنویسیم.
همان متد برای تمام اشیاء قابل استفاده است.
class Student:
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def show_info(self):
print(self.name, self.age, self.score)
student1 = Student("Ali", 18, 19.5)
student2 = Student("Sara", 20, 18.75)
student1.show_info()
student2.show_info()خروجی
Ali 18 19.5
Sara 20 18.75دقت کنید که کد متد فقط یک بار نوشته شده است، اما برای هر تعداد شیء میتوان از آن استفاده کرد.
همانند توابع، متدها نیز میتوانند از return استفاده کنند.
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
rect = Rectangle(5, 8)
print(rect.area())خروجی
40در این مثال، متد area مساحت مستطیل را محاسبه کرده و مقدار آن را برمیگرداند.
| تابع (Function) | متد (Method) |
|---|---|
| خارج از کلاس تعریف میشود. | داخل کلاس تعریف میشود. |
| مستقل است. | به یک کلاس و شیء تعلق دارد. |
| معمولاً با نام تابع فراخوانی میشود. | از طریق یک شیء فراخوانی میشود. |
به self نیاز ندارد. |
معمولاً اولین پارامتر آن self است. |
یک کلاس به نام Student ایجاد کنید که اطلاعات یک دانشآموز را ذخیره کند.
کلاس باید شامل ویژگیهای زیر باشد:
یک متد به نام show_info() ایجاد کنید که اطلاعات دانشآموز را نمایش دهد.
سپس دو شیء از این کلاس بسازید و اطلاعات آنها را نمایش دهید.
یک کلاس به نام Book ایجاد کنید که اطلاعات یک کتاب را نگهداری کند.
ویژگیهای کلاس:
یک متد به نام display() بنویسید که اطلاعات کتاب را چاپ کند.
سه کتاب مختلف ایجاد کنید و اطلاعات آنها را نمایش دهید.
یک کلاس به نام Product برای محصولات یک فروشگاه ایجاد کنید.
ویژگیهای کلاس:
متدی به نام show_product() بنویسید که اطلاعات محصول را نمایش دهد.
سپس چند محصول ایجاد کنید و اطلاعات آنها را چاپ کنید.
یک کلاس به نام BankAccount ایجاد کنید.
ویژگیهای کلاس:
متدهای زیر را ایجاد کنید:
دو حساب مختلف ایجاد کنید و چند عملیات واریز و برداشت روی آنها انجام دهید.
یک کلاس به نام Car طراحی کنید.
ویژگیهای کلاس:
دو متد ایجاد کنید:
چند خودرو بسازید و سرعت آنها را تغییر دهید.
در درس بعدی با یکی از مهمترین مفاهیم برنامهنویسی شیءگرا یعنی وراثت (Inheritance) در پایتون آشنا میشویم. وراثت به ما کمک میکند یک کلاس جدید را بر اساس یک کلاس موجود ایجاد کنیم و ویژگیها و متدهای آن را بدون نوشتن دوباره کد، استفاده کنیم. در این بخش یاد میگیریم چگونه کلاس والد و فرزند ایجاد کنیم، از تابع super() استفاده کنیم و با بازنویسی متدها، رفتار کلاسها را تغییر دهیم.
گام بعدی : وراثت در پایتوندیتابیس Database و مدل Model در جنگو از درس قبل به خاطر دارید که آطلاعات دورهها به صورت ثابت داخل
طراحی قالب سایت با HTML، CSS و Tailwind CSS تا اینجا با ساختار اصلی Django، URL، View و Template آشنا
Template و رابط کاربری در Django در سه درس قبلی، با ساخت پروژه، ساختار Django، URL و View آشنا شدیم.
URL و View در جنگو در درسهای قبل با Django آشنا شدیم، محیط مجازی را ساختیم، Django را نصب کردیم
ساختار Project و App در Django در درس قبل با Django آشنا شدیم، محیط مجازی ساختیم، Django را نصب کردیم
شروع کار با Django در دوره آموزش جامع پایتون با مفاهیمی مانند متغیرها، شرطها، حلقهها، توابع، کلاسها، فایلها و کار
عملیات CRUD درSQLite در بخش قبل با مفهوم پایگاه داده، SQLite و نحوه اتصال پایتون به پایگاه داده آشنا شدیم.
اتصال به پایگاه داده (Database) در پایتون وقتی یک برنامه اطلاعاتی را از کاربر دریافت میکند، معمولاً لازم است این
مدیریت خطا (Error Handling) در پایتون در هنگام اجرای برنامه، ممکن است کاربر ورودی نامناسبی وارد کند یا برنامه با
کار با فایل، ماژول، پکیج و محیط مجازی در پایتون در پروژههای واقعی، معمولاً همهی کدها را در یک فایل
کپسولهسازی (Encapsulation) در پایتون فرض کنید کلاسی برای حساب بانکی نوشتهاید. اگر هر کسی بتواند موجودی حساب را مستقیماً تغییر
وراثت و مفاهیم پیشرفته شی گرایی تا اینجا یاد گرفتهاید که چگونه با استفاده از کلاس (Class) و شی (Object)
کلاس و شیء در پایتون (Object-Oriented Programming) تا اینجا با متغیرها، شرطها، حلقهها، توابع و ساختارهای داده در پایتون آشنا
تابع لامبدا (Lambda Function) در پایتون گاهی اوقات فقط به یک تابع خیلی کوچک نیاز داریم؛ تابعی که قرار است
توابع در پایتون اگر هنگام برنامهنویسی مجبور شوید یک قطعه کد را بارها تکرار کنید، برنامه شما طولانی، شلوغ و
مجموعه (Set) در پایتون به زبان ساده، Set مجموعهای از عناصر منحصربهفرد (Unique) است که ترتیب مشخصی ندارد و اجازه
دیکشنری در پایتون تا اینجا با لیست (List) و تاپل (Tuple) آشنا شدیم که هر دو مجموعهای از دادهها را
تاپل (Tuple) در پایتون بعد از آشنایی با لیست (List)، نوبت به یکی دیگر از ساختارهای داده در پایتون یعنی
لیست (List) در پایتون پرکاربردترین ساختار داده تا اینجا یاد گرفتید که هر متغیر فقط یک مقدار را در خود
ساختارهای داده در پایتون در برنامههای واقعی معمولاً با یک داده سروکار نداریم، بلکه باید تعداد زیادی اطلاعات را ذخیره
حلقههای تکرار در پایتون (Python Loops) فرض کنید معلم میخواهد نمرات ۳۰ دانشآموز را از کاربر دریافت کند. اگر حلقه
عملگرهای مقایسهای (Comparison Operators) تا اینجا یاد گرفتیم که با عملگرهای محاسباتی میتوانیم اعداد را با هم جمع، تفریق و…
دریافت ورودی از کاربر در پایتون (Python Input) تا اینجا یاد گرفتیم که چگونه مقدار یک متغیر را خودمان داخل
عملگرهای محاسباتی در پایتون (Arithmetic Operators) تقریباً تمام برنامهها به انجام محاسبات نیاز دارند؛ از جمع و تفریق ساده گرفته
کار با رشتهها در پایتون (Python Strings) مدیریت و پردازش متنها در برنامهها در دنیای برنامهنویسی، اطلاعات همیشه عدد و
متغیرها در پایتون (Python Variables) اولین قدم برای ذخیره و پردازش اطلاعات تصور کنید یک برنامه مینویسید که قرار است
شروع برنامه نویسی با پایتون ساخت اولین پروژه (Hello World) فهرست مطالب بعد از نصب Python چه کاری انجام دهیم؟
آموزش نصب پایتون و ابزارهای موردنیاز (راهنمای کامل برای ویندوز) اگر تصمیم گرفتهاید برنامهنویسی را یاد بگیرید، احتمالاً نام زبان
الگوهای کندل استیک پیشرفته: راهنمای جامع برای معاملهگران حرفهای الگو های کندل استیک پیشرفته (یا به بیان دیگر الگوهای شمعی
آیلتس جنرال یا آکادمیک؟ کدام را باید انتخاب کنیم؟ آیا میدانید که انتخاب اشتباه بین آیلتس آکادمیک و جنرال میتواند
دانلود رایگان نمونه سوالات آزمون PTE جنرال اگر تصمیم گرفتهاید با هدف مهاجرت به یک کشور انگلیسی زبان، در آزمون
معرفی آزمون های زبان انگلیسی معتبر در ایران| کدام یک بهتر است؟ اگه قصد ادامه تحصیل یا مهاجرت داشته باشید،
بهترین روشهای آمادگی برای آزمون تافل چگونه برای آزمون تافل آماده شویم؟ آیا شما هم قصد دارید برای کسب نمره
چگونه در خارج از کشور برای آزمون آیلتس ثبت نام کنیم؟ اگر قصد مهاجرت تحصیلی یا کاری دارید، احتمالاً نام
آزمون GRE مناسب چه رشتههایی است؟ اگر قصد ادامه تحصیل در مقاطع کارشناسی ارشد یا دکترا در دانشگاههای بینالمللی را
بهترین نمونه سوالات اسپیکینگ تافل هوم ادیشن آزمون تافل هوم ادیشن این روزها یکی از پرطرفدارترین گزینهها برای سنجش مهارت
نحوه ثبت نام در آزمون دولینگو در ایران به صورت کامل نحوه ثبت نام در آزمون دولینگو در ایران چگونه
هزینه آزمون GRE در ایران چقدر است؟ اگر قصد مهاجرت تحصیلی دارید، احتمالاً نام آزمون GRE به گوشتان خورده است.
راهنمای کامل ثبتنام و پرداخت هزینه آزمون PTE در ترکیه برای متقاضیان ایرانی آزمون PTE (Pearson Test of English) یکی از
ووچر آزمون چیست و چگونه میتوان آن را تهیه کرد؟ ثبتنام در آزمونهای بینالمللی مانند TOEFL، GRE، PTE، GMAT، IELTS
بهترین تکنیک های لیسنینگ آیلتس برای کسب نمره بالا آزمون آیلتس (IELTS) یکی از معتبرترین آزمونهای ارزیابی مهارت زبان انگلیسی
آزمون پلاس مرجع آموزش برنامهنویسی، هوش مصنوعی، شبکه، نمونه سؤالات کنکورهای کامپیوتر، آزمونهای زبان دکتری و مدارک بینالمللی فناوری اطلاعات است. با ارائه آموزشهای تخصصی، منابع آموزشی و راهنمای آزمونها، به دانشجویان و متخصصان کمک میکنیم تا مهارتهای خود را توسعه داده و در مسیر موفقیت تحصیلی و شغلی گام بردارند.