🔹آشنایی با مفهوم Public و Private و Protected در شی گرایی
در برنامهنویسی شیگرا، این کلیدواژهها (Public، Private، Protected) برای تعریف دسترسی به اعضای یک کلاس استفاده میشوند. اینها به توسعهدهندگان کمک میکنند تا سطح دسترسی یک Property یا Method را مشخص کنند.
- Public
پراپرتی یا متدی که با کلمه کلیدی public تعریف میشود، در هر جای برنامه قابل دسترسی است. به این معنی که میتوان به آن از خارج از کلاس (Global)، داخل خود کلاس و از کلاسهای دیگر دسترسی داشت. این نوع دسترسی برای ارتباط عمومی بین اعضای یک کلاس با سایر اجزای برنامه استفاده میشود.
- Protected
عضوی که با کلمه کلیدی protected تعریف میشود، به این معنی است که هم از درون خود کلاس و نیز از طریق کلاسهایی که از آن ارثبری شدهاند میتوان به آنها دسترسی داشت. اما از خارج از کلاس یا کلاسهای دیگری که از این کلاس ارثبری نکردهاند نمیتوان به اعضای protected دسترسی پیدا کرد. این نوع دسترسی معمولاً برای ساختن روابط بین کلاسی استفاده میشود.
- Private
پراپرتی یا متدی که با کلمه کلیدی private تعریف میشود، تنها درون کلاس خود کلاس قابل دسترسی است و از خارج از کلاس یا سایر کلاسهای ارثبری شده نیز قابل دسترسی نیستند. دسترسی private معمولاً برای نگهداری جزئیات پنهان یا اطلاعات خصوصی کلاس استفاده میشود و اجازه دسترسی مستقیم به آنها از خارج کلاس محدود میشود.
#oop
☕ @CodeExplore
در برنامهنویسی شیگرا، این کلیدواژهها (Public، Private، Protected) برای تعریف دسترسی به اعضای یک کلاس استفاده میشوند. اینها به توسعهدهندگان کمک میکنند تا سطح دسترسی یک Property یا Method را مشخص کنند.
- Public
پراپرتی یا متدی که با کلمه کلیدی public تعریف میشود، در هر جای برنامه قابل دسترسی است. به این معنی که میتوان به آن از خارج از کلاس (Global)، داخل خود کلاس و از کلاسهای دیگر دسترسی داشت. این نوع دسترسی برای ارتباط عمومی بین اعضای یک کلاس با سایر اجزای برنامه استفاده میشود.
- Protected
عضوی که با کلمه کلیدی protected تعریف میشود، به این معنی است که هم از درون خود کلاس و نیز از طریق کلاسهایی که از آن ارثبری شدهاند میتوان به آنها دسترسی داشت. اما از خارج از کلاس یا کلاسهای دیگری که از این کلاس ارثبری نکردهاند نمیتوان به اعضای protected دسترسی پیدا کرد. این نوع دسترسی معمولاً برای ساختن روابط بین کلاسی استفاده میشود.
- Private
پراپرتی یا متدی که با کلمه کلیدی private تعریف میشود، تنها درون کلاس خود کلاس قابل دسترسی است و از خارج از کلاس یا سایر کلاسهای ارثبری شده نیز قابل دسترسی نیستند. دسترسی private معمولاً برای نگهداری جزئیات پنهان یا اطلاعات خصوصی کلاس استفاده میشود و اجازه دسترسی مستقیم به آنها از خارج کلاس محدود میشود.
#oop
☕ @CodeExplore
🔥14⚡4❤🔥1
🔹برنامهنویسی شیگرا Object-Oriented Programming - OOP چیست؟
در برنامهنویسی شیگرا، کد به شیها (objects) و کلاسها (classes) تقسیم میشود. هر شیء در OOP دارای وضعیت (متغیرها) و رفتار (متدها) است. این به ما این امکان را میدهد که موضوعات را به صورت واقعیتمحور (object-centric) شرح دهیم، بجای اینکه به شیوه ساختارمحور (procedural) عمل کنیم.
تصور کنید یک برنامه مدیریت کتابخانه دارید. در برنامهنویسی شیگرا، شما میتوانید یک کلاس "کتاب" ایجاد کنید که ویژگیهایی مانند عنوان، نویسنده، و شماره شابک را دارد. سپس شما میتوانید از این کلاس برای ایجاد اشیاء مختلفی مانند "کتاب" یا "رمان گذر" استفاده کنید.
🔸 برنامهنویسی رویهای Procedural Programming چیست؟
در برنامهنویسی رویهای، برنامه به صورت مجموعهای از رویهها یا توالیهای دستورات سازماندهی میشود. تمرکز اصلی بر روی دستورات و توالی اجرا قرار دارد، و مفاهیمی مانند تقسیم مسئله به اجزای کوچکتر یا تجزیه و تحلیل (decomposition) از اهمیت زیادی برخوردارند.
اگر در برنامهنویسی رویهای بخواهید یک برنامه برای محاسبه میانگین اعداد در یک لیست بنویسید، ممکن است شما یک توالی از دستورات برای جمع زدن اعداد لیست و سپس تقسیم بر تعداد اعضا را بنویسید.
#oop #procedural
☕ @CodeExplore
در برنامهنویسی شیگرا، کد به شیها (objects) و کلاسها (classes) تقسیم میشود. هر شیء در OOP دارای وضعیت (متغیرها) و رفتار (متدها) است. این به ما این امکان را میدهد که موضوعات را به صورت واقعیتمحور (object-centric) شرح دهیم، بجای اینکه به شیوه ساختارمحور (procedural) عمل کنیم.
تصور کنید یک برنامه مدیریت کتابخانه دارید. در برنامهنویسی شیگرا، شما میتوانید یک کلاس "کتاب" ایجاد کنید که ویژگیهایی مانند عنوان، نویسنده، و شماره شابک را دارد. سپس شما میتوانید از این کلاس برای ایجاد اشیاء مختلفی مانند "کتاب" یا "رمان گذر" استفاده کنید.
class Book:
def init(self, title, author, ISBN):
self.title = title
self.author = author
self.ISBN = ISBN
def display_info(self):
print(f"Title: {self.title}, Author: {self.author}, ISBN: {self.ISBN}")
first_book = Book("The Catcher in the Rye", "J.D. Salinger", "9780316769488")
second_book = Book("To Kill a Mockingbird", "Harper Lee", "0061120081")
first_book.display_info()
second_book.display_info()
🔸 برنامهنویسی رویهای Procedural Programming چیست؟
در برنامهنویسی رویهای، برنامه به صورت مجموعهای از رویهها یا توالیهای دستورات سازماندهی میشود. تمرکز اصلی بر روی دستورات و توالی اجرا قرار دارد، و مفاهیمی مانند تقسیم مسئله به اجزای کوچکتر یا تجزیه و تحلیل (decomposition) از اهمیت زیادی برخوردارند.
اگر در برنامهنویسی رویهای بخواهید یک برنامه برای محاسبه میانگین اعداد در یک لیست بنویسید، ممکن است شما یک توالی از دستورات برای جمع زدن اعداد لیست و سپس تقسیم بر تعداد اعضا را بنویسید.
def calculate_average(num_list):
total = sum(num_list)
count = len(num_list)
average = total / count
return average
my_list = [3, 5, 7, 11, 13, 17]
result = calculate_average(my_list)
print(f"The average is: {result}")
#oop #procedural
☕ @CodeExplore
⚡10🔥4❤🔥1
🔺تفاوت برنامه نویسی شی گرا و برنامه نویسی رویه ای
1. منطق و ساختار:
- OOP: تمرکز بر روی اشیاء و آنچه که انجام میدهند و ویژگیهایشان دارد.
- Procedural: تمرکز بر روی دستورات و توالی اجرا.
2. تجزیه و تحلیل مسئله:
- OOP: به کمک مفاهیم چیدمانی شیء میتوان به ساختار منظمی دست یافت.
- Procedural: با تقسیم مسئله به اجزای کوچکتر و توالی اجرا آنها به رسیدگی میشود.
3. سطح انتزاع (Abstraction):
- OOP: قابلیت انتزاع بالا با استفاده از کلاسها و اشیاء.
- Procedural: سطح کمتری از انتزاع وجود دارد.
4. باز استفاده کد (Code Reusability):
- OOP: کد قابل استفاده مجددی را بوجود میآورد.
- Procedural: کد تکراریتر است و بازاستفاده کمتری دارد.
5. تعمیم (Generalization) و وابستگی (Dependency):
- OOP: میتوان کلاسها را به یکدیگر مرتبط کرد و ارثبری و پلیمرفیسم را پشتیبانی میکند.
- Procedural: این قابلیتها کمتر مورد پشتیبانی قرار میگیرند.
در نهایت، انتخاب بین این دو رویکرد به میزان پیچیدگی پروژه، ساختار و توسعه پذیری برنامه و البته تجربه و توانایی برنامهنویس بستگی دارد.
اگر تفاوت دیگه توی ذهنتون هست توی کامنت ها بنویسید🧡
#oop #procedural
☕ @CodeExplore
1. منطق و ساختار:
- OOP: تمرکز بر روی اشیاء و آنچه که انجام میدهند و ویژگیهایشان دارد.
- Procedural: تمرکز بر روی دستورات و توالی اجرا.
2. تجزیه و تحلیل مسئله:
- OOP: به کمک مفاهیم چیدمانی شیء میتوان به ساختار منظمی دست یافت.
- Procedural: با تقسیم مسئله به اجزای کوچکتر و توالی اجرا آنها به رسیدگی میشود.
3. سطح انتزاع (Abstraction):
- OOP: قابلیت انتزاع بالا با استفاده از کلاسها و اشیاء.
- Procedural: سطح کمتری از انتزاع وجود دارد.
4. باز استفاده کد (Code Reusability):
- OOP: کد قابل استفاده مجددی را بوجود میآورد.
- Procedural: کد تکراریتر است و بازاستفاده کمتری دارد.
5. تعمیم (Generalization) و وابستگی (Dependency):
- OOP: میتوان کلاسها را به یکدیگر مرتبط کرد و ارثبری و پلیمرفیسم را پشتیبانی میکند.
- Procedural: این قابلیتها کمتر مورد پشتیبانی قرار میگیرند.
در نهایت، انتخاب بین این دو رویکرد به میزان پیچیدگی پروژه، ساختار و توسعه پذیری برنامه و البته تجربه و توانایی برنامهنویس بستگی دارد.
اگر تفاوت دیگه توی ذهنتون هست توی کامنت ها بنویسید🧡
#oop #procedural
☕ @CodeExplore
⚡11🔥5❤🔥1
ساختار برنامه نویسی شیء گرا (OOP):
♾اصول اصلی OOP :
#oop #oop_1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12❤🔥5⚡4
Ruby , Scala , JADE , Emerald
Java , Python , C++
Visual Basic .NET , PHP , JavaScript
-ماژولار ( Modularity ) : پوشش باعث میشه که شی ها خود کفا بشن و دیباگ و عیب یابی و توسعه همکاری خیلی آسون تر بشه
-قابلیت استفاده مجدد کد ( Reusability ) : کد ها میتونن از طریق ارث بری دوباره استفاده بشن، به این معنی که تیم شما دیگه نیاز نیست یه کد رو چند بار بنویسه.
-بهره وری ( Productivity ) : برنامه نویسا میتونن برنامه های جدید رو سریع تر با استفاده از کتابخونه های متعدد و قابل استفاده مجدد بسازن
-مقیاس پذیر و قابل ارتقا ( Easily upgradable and scalable ) : برنامه نویسا میتونن عملکرد های سیستم برنامه رو به طور مستقل پیاده سازی کنن
-توصیفات رابط ( Interface descriptions ) : سیستم های خارجی ساده هستن و به همین دلیل تکنلیک های ارسال پیام که برای ارتباط شیء ها استفاده میشن.
-امنیت ( Security ) : با استفاده از پوشش و تجرید ، کد پیچیده مخفی میشه و نگهداری نرم افزار آسان تر میشه و علاوه بر اون، پروتکل های اینترنت محافظت میشن.
-انعطاف پذیری ( Flexibility ) : چند ریختی اجازه اینو میده که یک تابع واحد به کلاس که داخل اون قرار داره تنظیم بشه و شیء های مختلف هم از طریق یک رابط یکسان رد بشن.
#oop #oop_2
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡10🔥6❤🔥3
برای مثال میتونیم یه کلاس Car داشته باشیم که این موارد رو داخل خودش داره:
متغیر یا پراپرتی های color , model , year برای ویژگی های ماشین و توابع زیر ( البته گفتیم تابعی که داخل ابجکت باشه بهش میگن متود)
start() , stop() , accelerate()
حالا ما اگر بخایم داخل javascript این کلاس رو بسازیم کدش به شکل زیر میشه:
class Car{
constructor(color , model , year){
this.color = color;
this.model = model;
this.year = year;
}
start() {
//Codes
}
stop() {
//Codes
}
accelerate() {
//Codes
}
logColor(){
console.log(this.color);
}
}
خب این کد های ما الان دارن یه کلاس رو نشون میدن که یه constructor یا همون سازنده داره و یسری ورودی هارو دریافت میکنه و اونارو به ویژگی های شیء نسبت میده، و یسری متود هم داریم که فعلا داخلشون کدی نزدیم ولی یه تابع logColor داریم که برامون رنگ ماشین رو چاپ میکنه ( دقت کنین دوستان دیگه اینجا کلمه کلیدی this اشاره به همون ابجکتمون داره)
برای ساخت شیء از روی کلاس ها توی javascript این کار رو میکنیم:
const myCar = new Car("red" , "206" , 2023);
الان اینجا ما یه متغیر ( البته چون const به کار رفته ثابت هست ) ساختیم و این ثابت با اسم myCar یه اینستنس هست از کلاس Car و ورودی هایی که داخل constructor مشخص کرده بودیم رو براش فرستادیم
حالا بیاین ببینیم داره چه اتفاقی میوفته
myCar.logColor();
console.log(myCar);
const anotherCar = new Car("blue" , "234" , 2021)
console.log(anotherCar);
anotherCar.logColor()
#oop #oop_3
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡8❤🔥4🔥4
سلام به همه دوستان کد اکسپلوری ✌️
قراره امروز در رابطه با underscore در پایتون صحبت کنیم.(که واقعا احتمال میدم طولانی بشه ✨)
شاید underscore برای تازه کارا یکم جدید باشه ولی زیاد به اسمش کار نداشته باشید چون همون آندرلاین خودمونه (_)
بخوام خیلی جامع توضیح بدم کلا ۵ حالت داریم که از underscore توی پایتون استفاده میکنیم.
1️⃣ اولین حالت بصورت استفاده خالی ازشه ، بزارید یه مثال ریز بزنم :
اگه جایی همچین چیزی دیدید ، اولین موردی که باید بدونید ، اینه که خود پایتون همیشه اخرین مقداری که به مفسر میدید رو داخل _ میریزه (به عنوان last variable) و دومین چیزی که باید بدونید اینه که برنامه نویسی که از underscore خالی استفاده میکنه، دنبال یه متغیر موقت میگرده و جای دیگه ایی ازش استفاده نمیکنه (مثلا داخل حلقه خیلی استفادش منطقیه 🙄)
کلا زمانی از underscore خالی استفاده میکنیم که واقعا نیازی به متغیر در جاهای دیگه نداریم و کلا فقط همونجا بکارمون میاد 🫠
حالت دوم تا پنجم استفاده از underscore در واقع میشه گفت به جایگشته !
یعنی یا قبل از اسم میاد یا بعدش یا از هر دو طرفش یا یدونه میاد یا دوتا
احتمالا گیج شدید ☹️
ولی الان مثال میزنم که درک کنیم.
2️⃣حالت دوم زمانیه که شما از یدونه underscore قبل از اسم یا متود استفاده میکنید . مثل زیر :
خب حالا اصلا این اسم گذاری چیکار میکنه؟
اگه زبان دیگه ایی مثل جاوا یا php کار کرده باشید میدونید که اعضا داخل کلاس ها Access Modifiers دارن (خیلی ساده بخوام بهش اشاره کنم ، یعنی تعریف میکنه این متغیر از کجا بهش دسترسی داریم و کجا نداریم)
اگرم فقط پایتون کار کردید میدونید که پایتون اکسس مکسس نمیشناسه 🫡
و نمیتونید براش public , private و ... تعریف کنید . حالا اینارو برای چی گفتم؟ که برسم به underscope قبل از اسم؛ دقیقا یدونه اندرلاین قبل از اسم تابع یا متغیر باعث میشه که ما اون متغیر یا تابع رو private ببینیم و بدونیم که خارج از این کلاس استفاده نمیشه (البته توجه کنید که پایتون اصلا پیگیر اینا نیست! یعنی شما _ هم بزارید و import کنید بازم میتونید به اون متغیر دسترسی داشته باشید! این نوع نام گذاری بیشتر برای مشخص کردن برای خودتون و اعضا تیمه وگرنه خود پایتون کلا اهمیتی بهش نمیده! 😕)
البته نه که کلا اهمیت نده! زیر یه مثال میزنم تا اهمیتشو ببنیم :
Class C1:
فایل بالا رو ایمپورت میکنیم :
Class C2:
حالت سومو من خودم خیلی دوست دارم😄
3️⃣ حالت سوم شما underscore رو بعد از اسم قرار میدید (ولی نه هر اسمی!) یعنی میشه گفت یجور تریک حساب میشه. مثلا شما میخواید یه متغیر تعریف کنید به اسم class ولی class خودش یه کلمه کلیدیه (شاید بگید خب اسمشو عوض میکنیم! اما یه وقتایی دقیقا اون متغیر نیاز به همچین اسمی داره ✅) اینجاست که به عنوان برنامه نویس underscore رو به ته اسم اضافه میکنیم :
#پست_پیشنهادی
#part1
#python #underscore #variable #oop
☕️ @CodeExplore
قراره امروز در رابطه با underscore در پایتون صحبت کنیم.(که واقعا احتمال میدم طولانی بشه ✨)
شاید underscore برای تازه کارا یکم جدید باشه ولی زیاد به اسمش کار نداشته باشید چون همون آندرلاین خودمونه (_)
بخوام خیلی جامع توضیح بدم کلا ۵ حالت داریم که از underscore توی پایتون استفاده میکنیم.
1️⃣ اولین حالت بصورت استفاده خالی ازشه ، بزارید یه مثال ریز بزنم :
_ = 'hello'
# Or
for _ in range(1, 10):
print(_)
اگه جایی همچین چیزی دیدید ، اولین موردی که باید بدونید ، اینه که خود پایتون همیشه اخرین مقداری که به مفسر میدید رو داخل _ میریزه (به عنوان last variable) و دومین چیزی که باید بدونید اینه که برنامه نویسی که از underscore خالی استفاده میکنه، دنبال یه متغیر موقت میگرده و جای دیگه ایی ازش استفاده نمیکنه (مثلا داخل حلقه خیلی استفادش منطقیه 🙄)
کلا زمانی از underscore خالی استفاده میکنیم که واقعا نیازی به متغیر در جاهای دیگه نداریم و کلا فقط همونجا بکارمون میاد 🫠
حالت دوم تا پنجم استفاده از underscore در واقع میشه گفت به جایگشته !
یعنی یا قبل از اسم میاد یا بعدش یا از هر دو طرفش یا یدونه میاد یا دوتا
احتمالا گیج شدید ☹️
ولی الان مثال میزنم که درک کنیم.
2️⃣حالت دوم زمانیه که شما از یدونه underscore قبل از اسم یا متود استفاده میکنید . مثل زیر :
_name = 'xxx'
def _fun():
print(1)
خب حالا اصلا این اسم گذاری چیکار میکنه؟
اگه زبان دیگه ایی مثل جاوا یا php کار کرده باشید میدونید که اعضا داخل کلاس ها Access Modifiers دارن (خیلی ساده بخوام بهش اشاره کنم ، یعنی تعریف میکنه این متغیر از کجا بهش دسترسی داریم و کجا نداریم)
اگرم فقط پایتون کار کردید میدونید که پایتون اکسس مکسس نمیشناسه 🫡
و نمیتونید براش public , private و ... تعریف کنید . حالا اینارو برای چی گفتم؟ که برسم به underscope قبل از اسم؛ دقیقا یدونه اندرلاین قبل از اسم تابع یا متغیر باعث میشه که ما اون متغیر یا تابع رو private ببینیم و بدونیم که خارج از این کلاس استفاده نمیشه (البته توجه کنید که پایتون اصلا پیگیر اینا نیست! یعنی شما _ هم بزارید و import کنید بازم میتونید به اون متغیر دسترسی داشته باشید! این نوع نام گذاری بیشتر برای مشخص کردن برای خودتون و اعضا تیمه وگرنه خود پایتون کلا اهمیتی بهش نمیده! 😕)
البته نه که کلا اهمیت نده! زیر یه مثال میزنم تا اهمیتشو ببنیم :
Class C1:
name = 'amir'
_age = 21
فایل بالا رو ایمپورت میکنیم :
Class C2:
from C1 import name, _age
# کد بالا خیلی راحت بدون ارور اجرا میشه
# # # # #
import C1
C1._age
# بازم کد بالا بدون ارور اجرا میشه
# # # # #
from C1 import *
print(_age)
# ایندفعه به ارور میخوریم! پایتون فقط در زمانی آندراسکوپ رو ایمپورت نمیکنه که شما ستاره بزارید، در غیر اینصورت خیلی معمولی رفتار میکنه!!!!
حالت سومو من خودم خیلی دوست دارم😄
3️⃣ حالت سوم شما underscore رو بعد از اسم قرار میدید (ولی نه هر اسمی!) یعنی میشه گفت یجور تریک حساب میشه. مثلا شما میخواید یه متغیر تعریف کنید به اسم class ولی class خودش یه کلمه کلیدیه (شاید بگید خب اسمشو عوض میکنیم! اما یه وقتایی دقیقا اون متغیر نیاز به همچین اسمی داره ✅) اینجاست که به عنوان برنامه نویس underscore رو به ته اسم اضافه میکنیم :
class = 'class one'
# error bteaking
class_ = 'class two'
# without error
#پست_پیشنهادی
#part1
#python #underscore #variable #oop
☕️ @CodeExplore
⚡12🔥10❤🔥4
خب ادامه حالت هارو هم بگم تا نصفه ولش نکنیم 😀
خب حالت چهارم یکمی از سادگی خارج میشه و وارد بحث شی گرایی میشه! از الان بگم !
4️⃣ حالت چهارم شما دوتا underscope قبل اسم میزاری (که بهش میگن double underscope یا بین برنامه نویسا جا افتاده dunder) یعنی متغیر name__ رو میخونیم داندر نِیم
حالا جدا از اسمش ، این یکی دقیقا چیکار میکنه برامون؟ اینو کلا باید با مثال برم جلو🤓
فرض کنید ما دوتا کلاس داریم که یکی از کلاس ها از اون یکی ارث بری میکنه :
اگه به کلاس های بالا نگا کنید توی جفتشون یه فیلد name داریم ، و چون کلاس teacher از human ارث بری میکنه و داخل خودش صداش میزنه دوتا فیلد name باهم قاطی میشن🥲
اونوقت ما چجوری میتونیم به جفتشون دسترسی داشته باشیم؟
اینجاست که dunder میاد وسط و مثال بالا رو تغییر میدیم:
شاید بگید خب الانم که اسماشون باز شبیه همه، ولی داندر داره! اینجاست که پایتون میگه من دخالت میکنم و اسامی که به صورت dunder دار نوشته شدن رو تغییر میدم😎
بیاید یه شی بسازیم و ببنیم توش چیه :
میبیند که با اضافه کردن dunder پایتون کلا اسم پراپرتی رو عوض کرد و اسم کلاس رو اولش چسبوند. اینجوری خیلی راحت از هم تفکیک میشن😁
5️⃣ و آخرین حالتم زمانیه که شما یه dunder اول اسم میزارید و یدونه هم اخر اسم
که میشه مثل __init__ که بهش میگن magic method و خود مفسر پایتون کاری به این نوع اسم گذاریتون نداره و فقط برای خوانایی کده! یعنی خودتون تصمیم میگیرد فلان تابع رو اینجوری تعریف کنید برای فلان کار (یعنی برای یه کار خاص رزروش کنید و بدونید خارج از اونجا هم کاری باهاش ندارید و فقط برای یه کاره)
مثلا همین __init__ رو وقتی داخل یه کلاس صدا میزنید یعنی تابع سازنده رو صدا زدید و میدونید که این تابع هم خارج از خود کلاس به کار نمیاد و فقط رزرو شده برای سازنده بودن!
در اخرم باید بگم برای سنیور شدن حتما این چیزا رو رعایت کنید. هم برای درک خودتون خوبه هم برای بقیه برنامه نویسایی که کدتونو نگا میکنن✨
دیگه کوتاه تر از این نمیتونستم بکنم.
روز خوبی داشته باشید💓
#پست_پیشنهادی
#part2
#python #underscope #oop
☕️ @CodeExplore
خب حالت چهارم یکمی از سادگی خارج میشه و وارد بحث شی گرایی میشه! از الان بگم !
حالا جدا از اسمش ، این یکی دقیقا چیکار میکنه برامون؟ اینو کلا باید با مثال برم جلو
فرض کنید ما دوتا کلاس داریم که یکی از کلاس ها از اون یکی ارث بری میکنه :
class Human():
def __init__(self):
self.sex = 'male'
self.name = 'karim'
class Teacher(Human):
sef __init__(self):
super().__init__()
self.count = 2
self.name = 'math'
اگه به کلاس های بالا نگا کنید توی جفتشون یه فیلد name داریم ، و چون کلاس teacher از human ارث بری میکنه و داخل خودش صداش میزنه دوتا فیلد name باهم قاطی میشن
اونوقت ما چجوری میتونیم به جفتشون دسترسی داشته باشیم؟
اینجاست که dunder میاد وسط و مثال بالا رو تغییر میدیم:
class Human():
def __init__(self):
self.sex = 'male'
self.__name = 'karim'
class Teacher(Human):
sef __init__(self):
super().__init__()
self.count = 2
self.__name = 'math'
شاید بگید خب الانم که اسماشون باز شبیه همه، ولی داندر داره! اینجاست که پایتون میگه من دخالت میکنم و اسامی که به صورت dunder دار نوشته شدن رو تغییر میدم
بیاید یه شی بسازیم و ببنیم توش چیه :
t1 = Teacher()
dir(t1)
# ['_Human__name', '_Teacher__name', 'sex', 'count']
میبیند که با اضافه کردن dunder پایتون کلا اسم پراپرتی رو عوض کرد و اسم کلاس رو اولش چسبوند. اینجوری خیلی راحت از هم تفکیک میشن
که میشه مثل __init__ که بهش میگن magic method و خود مفسر پایتون کاری به این نوع اسم گذاریتون نداره و فقط برای خوانایی کده! یعنی خودتون تصمیم میگیرد فلان تابع رو اینجوری تعریف کنید برای فلان کار (یعنی برای یه کار خاص رزروش کنید و بدونید خارج از اونجا هم کاری باهاش ندارید و فقط برای یه کاره)
مثلا همین __init__ رو وقتی داخل یه کلاس صدا میزنید یعنی تابع سازنده رو صدا زدید و میدونید که این تابع هم خارج از خود کلاس به کار نمیاد و فقط رزرو شده برای سازنده بودن!
در اخرم باید بگم برای سنیور شدن حتما این چیزا رو رعایت کنید. هم برای درک خودتون خوبه هم برای بقیه برنامه نویسایی که کدتونو نگا میکنن
دیگه کوتاه تر از این نمیتونستم بکنم.
روز خوبی داشته باشید
#پست_پیشنهادی
#part2
#python #underscope #oop
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡13❤🔥9🔥6
امروز قراره به ادامه مباحث OOP و ساختار کلاس ها و ویژگی های اون بپردازیم
بریم یه مثال قشنگ هم باهم ببینیم:
class Person{
constructor(personName , personAge){
this.name = personName;
this.age = personAge;
}
walk(){
console.log(`${this.name} started walking`);
}
}
let person = new Person("Reza" , 50);
person.walk();
console.log(person);
delete person.age;
console.log(person);
let person = null;
متود walk هم میاد یه جمله چاپ میکنه
بعدش از متود walk استفاه کردیم
#oop #oop_4
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡7❤🔥4🔥4
امروز قراره به مبحث Encapsulation یا همون پوشش یا پوشاندن توی شیءگرایی بپردازیم
-در اصل Encapsulation یعنی محدود کردن دسترسی به برخی از اجزای یک شیء، این کارو میتونیم با قرار دادن یسری داده ها و متد ها داخل کلاس انجام بدیم
-موقع استفاده از Encapsulation ، این اجازه به ما داده میشه که جزئیات رو از کاربران مخفی کنیم و فقط رابط کاربری رو نشون بدیم. اینطوری هم کدمون ساده تر و قابل فهم تره هم امنیت بیشتری داره و قابل نگهداری تره.
class Car {
constructor(model) {
this._model = model;
}
get model() {
return this._model;
}
set model(value) {
if (value.length < 3) {
console.log('Model is too short.');
return;
}
this._model = value;
}
}
let myCar = new Car("Toyota");
console.log(myCar.model); // Outputs: "Toyota"
myCar.model = "VW";
console.log(myCar.model); // Outputs: "VW"
myCar.model = "X"; // Outputs: "Model is too short."
#oop #oop_5
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡8❤🔥5🔥5
-ارث بری یعنی اینکه ما ویژگی ها و رفتار های یک کلاس رو به کلاس دیگه انتقال بدیم، یعنی یه کلاس داشته باشیم که ویژگی هاشو از یه کلاس دیگه به ارث برده و استفاده میکنه
-وقتی ما داریم از ارث بری استفاده میکنیم، اون کلاسی که ویژگی ها و متدهاشو به کلاس دیگه منتقل میکنه، بهش میگن کلاس پایه یا کلاس اصلی ( شما فرض کن پدر ) و اون کلاسی هم که ویژگی ها و متدهارو به ارث میبره میشه زیرکلاس یا کلاس مشتق (اینم میشه بچش)
حالا باهم یه مثال ببینیم:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound.`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
bark() {
console.log(`${this.name} barks!`);
}
}
const myDog = new Dog("Buddy", "Golden Retriever");
myDog.speak(); // Outputs: "Buddy makes a sound."
myDog.bark(); // Outputs: "Buddy barks!"
#oop #oop_6
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡12🔥6❤🔥3
چندریختی یکی از پایههای اصلی برنامه نویسی شیءگراس که مفهومش میشه همون چندشکلی یا قابلیت داشتن چندین شکل که البته واضحه. این مفهوم به آبجکت هامون این اجازه رو میده تا رفتار های متفاوتی برای یه متود یا یه عمل یکسان از خودشون نشون بدن. یعنی میتونیم یه متود رو چندین بار تعریف کنیم و کارای مختلفی باهاش کنیم با اینکه اسمشون یکیه
مثال زیر نحوه استفاده از چند ریختی در زمان بارگذاری متود ( Method Overloading ) رو نشونتون میده:
class Shape {
draw() {
console.log("Drawing a shape");
}
draw(width, height) {
console.log("Drawing a shape with width:", width, "and height:", height);
}
}
class Circle extends Shape {
draw() {
console.log("Drawing a circle");
}
draw(radius) {
console.log("Drawing a circle with radius:", radius);
}
}
const circle = new Circle();
circle.draw(); // Output: Drawing a circle
circle.draw(10); // Output: Drawing a circle with radius: 10
const shape = new Shape();
shape.draw(); // Output: Drawing a shape
وابستگی در OOP اشاره به ارتباط دوتا کلاس به هم داره که یعنی یه کلاس برای اینکه کارشو انجام بده نیاز به یه کلاس دیگه داره، این وابستگی ها هم میتونه به صورت مستقیم یا غیر مستقیم باشه
یه مثال هم از وابستگی باهم ببینیم:
class Animal {
constructor(name, soundMaker) {
this.name = name;
this.soundMaker = soundMaker;
}
makeSound() {
this.soundMaker.makeSound(this);
}
}
class SoundMaker {
makeSound(animal) {
console.log(`${animal.name} makes a ${animal.sound}`);
}
}
const dog = new Animal("Dog", new SoundMaker());
const cat = new Animal("Cat", new SoundMaker());
dog.makeSound(); // Output: Dog makes a bark
cat.makeSound(); // Output: Cat makes a meow
#oop #oop_7
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8⚡4🔥2💔1
-ترکیب یه مفهوم پایه تو OOP به حساب میاد که این امکانو به ما میده که آبجکت هامون رو از یه آبجکت دیگه بسازیم. و خصوصیات و ویژگی های هردورو باهم ترکیب کنیم
ترکیب در اصل یه نوعی از ارتباط بین آبجکت هاس که توی اون یه آبجکت که آبجکت صاحب هست، تمام خصوصیات و ویژگی های یک یا چند آبجکت دیگه رو توی خودش جا میده، یعنی آبجکت صاحب از بقیه آبجکت های جزء به عنوان اجزاء خودش استفاده میکنه
یه مثال ازش ببینیم:
class VendingMachine {
constructor(products, coins) {
this.products = products;
this.coins = coins;
}
selectProduct(productCode) {
const product = this.products.find(p => p.code === productCode);
if (!product) {
throw new Error("Invalid product code");
}
return product;
}
insertCoin(coinValue) {
this.coins.push(coinValue);
}
returnCoins() {
const totalCoins = this.coins.reduce((sum, coin) => sum + coin, 0);
this.coins = [];
return totalCoins;
}
dispenseProduct(productCode) {
const product = this.selectProduct(productCode);
const price = product.price;
const totalCoins = this.coins.reduce((sum, coin) => sum + coin, 0);
if (totalCoins < price) {
throw new Error("Insufficient funds");
}
const change = totalCoins - price;
this.coins = [];
console.log(`Here is your ${product.name}.`);
if (change > 0) {
console.log(`Your change is ${change} coins.`);
}
}
}
class Product {
constructor(code, name, price) {
this.code = code;
this.name = name;
this.price = price;
}
}
class Coin {
constructor(value) {
this.value = value;
}
}
// Create products and coins
const products = [
new Product("A1", "Snickers", 100),
new Product("B2", "Coke", 80),
new Product("C3", "Chips", 60),
];
const coins = [
new Coin(50),
new Coin(20),
new Coin(10),
];
// Create vending machine
const vendingMachine = new VendingMachine(products, coins);
// Simulate usage
vendingMachine.insertCoin(50);
vendingMachine.insertCoin(50);
vendingMachine.selectProduct("B2");
vendingMachine.dispenseProduct("B2");
console.log("Remaining coins:", vendingMachine.returnCoins());
-یک واسط در OOP مجموعهای از متدهارو تعریف میکنه که یه کلاس یا شیء باید اون مجموعه رو پیاده سازی کنه. واسط ها این قابلیت رو به ما میدن که بدون نیاز به وراثت، بین آبجکت هامون رفتار های مشابه ایجاد کنیم، دقت کنین توی زبان های مختلف ممکنه مفهومش متفاوت باشه، مثلا ما توی Javascript اگه بخایم از واسط ها استفاده کنیم باید بریم Typescript و اینترفیس تعریف کنیم که توی مثال باهم میبینیم
مثال استفاده از واسط ها:
interface Shape {
draw();
getArea();
}
class Circle implements Shape {
constructor(radius) {
this.radius = radius;
}
draw() {
console.log("Drawing a circle with radius", this.radius);
}
getArea() {
return Math.PI * this.radius * this.radius;
}
}
class Square implements Shape {
constructor(sideLength) {
this.sideLength = sideLength;
}
draw() {
console.log("Drawing a square with side length", this.sideLength);
}
getArea() {
return this.sideLength * this.sideLength;
}
}
// Create shapes
const circle = new Circle(5);
const square = new Square(10);
// Draw and calculate area
circle.draw();
console.log("Circle area:", circle.getArea());
square.draw();
console.log("Square area:", square.getArea());
#oop #oop_8
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11⚡5❤🔥2