Ninja Learn | نینجا لرن
1.26K subscribers
102 photos
38 videos
11 files
313 links
یادگیری برنامه نویسی به سبک نینجا 🥷
اینجا چیزایی یاد میگیری که فقط نینجاهای وب‌ بلدن 🤫

📄 Send me post: https://t.iss.one/NoronChat_bot?start=sec-fdggghgebe

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
الستیک سرچ در جنگو

اگه یه سیستم داری که نیاز داره روی دیتا جستجوهای سریع و پیشرفته انجام بشه، الستیک سرچ (Elasticsearch) یکی از بهترین انتخاب‌هاست. این ابزار جستجوی قدرتمند بهت کمک می‌کنه تا جستجوهایی مثل فیلترهای پیچیده، جستجوی تمام‌متنی (Full-Text Search) و حتی پیشنهادات مرتبط رو راحت پیاده‌سازی کنی. حالا بیا ببینیم چطور می‌تونی ازش تو پروژه‌های جنگو استفاده کنی.


چرا الستیک سرچ؟
جنگو با ORM خودش برای کوئری‌ها خوبه، ولی وقتی تعداد رکوردها زیاد بشه یا بخوای جستجوی خیلی پیچیده بزنی، سرعت و انعطافش کم می‌شه. اینجا الستیک سرچ به دادت می‌رسه.

تا باهاش می‌تونی:

🔍 جستجوهای سریع‌تر داشته باشی حتی با دیتاست‌های بزرگ

جستجوی full-text یا فازی (مثل پیشنهاد‌های تایپ‌شده اشتباه) انجام بدی

داده‌ها رو بر اساس 📊 اولویت و امتیاز (Relevance) مرتب کنی


راه‌اندازی Elasticsearch در جنگو
برای اینکه الستیک سرچ رو به پروژه جنگوت اضافه کنی، مراحل زیر رو دنبال کن:

1⃣ نصب Elasticsearch
اول از همه باید الستیک سرچ رو نصب و راه‌اندازی کنی. می‌تونی از Docker استفاده کنی:
docker run -d -p 9200:9200 -e "discovery.type=single-node" elasticsearch:8.10.1  

2⃣ نصب کتابخونه‌ها
پکیج‌هایی مثل elasticsearch-dsl و django-elasticsearch-dsl کار رو خیلی راحت می‌کنن:
pip install elasticsearch-dsl django-elasticsearch-dsl  

3⃣ تنظیمات اولیه
توی فایل تنظیمات جنگو (settings.py)، آدرس و پورت الستیک سرچ رو مشخص کن:
ELASTICSEARCH_DSL = {  
'default': {
'hosts': 'localhost:9200'
}
}




ایجاد ایندکس و اتصال به مدل‌ها
حالا باید داده‌هات رو به الستیک سرچ وصل کنی و ایندکس بسازی.

ایجاد Document برای مدل‌ها
خب Document جاییه که مدل‌های جنگو رو به ایندکس الستیک سرچ وصل می‌کنه:
from django_elasticsearch_dsl import Document  
from django_elasticsearch_dsl.registries import registry
from .models import Article

@registry.register_document
class ArticleDocument(Document):
class Index:
name = 'articles' # اسم ایندکس

class Django:
model = Article
fields = [
'title',
'content',
'published_at',
]

ایندکس کردن داده‌ها
برای انتقال داده‌های فعلی به الستیک سرچ:
python manage.py search_index --rebuild  




پیاده‌سازی جستجو در ویوها
حالا بیا یه API برای جستجو درست کنیم:

ویو جستجو
from django.http import JsonResponse  
from .documents import ArticleDocument

def search_articles(request):
query = request.GET.get('q', '')
results = ArticleDocument.search().query("multi_match", query=query, fields=["title", "content"])
data = [hit.to_dict() for hit in results]
return JsonResponse({'results': data})



اضافه کردن به URL‌ها
from django.urls import path  
from .views import search_articles

urlpatterns = [
path('search/', search_articles, name='search_articles'),
]


ادامه پست بعدی

امید وارم مفید بوده باشه :)

#python #django #web


🔆 CHANNEL | GROUP
117👍4
سلام دوستان 👋

اگه با پایتون API توسعه داده باشید، حتماً می‌دونید که پیاده‌سازی pagination هرچند سخت نیست، اما توی پروژه‌های مختلف ممکنه وقت‌گیر و تکراری بشه.
برای همین یه پکیج مینیمال و کاربردی به اسم Pagify نوشتم که مدیریت pagination رو برای شما راحت‌تر و منعطف‌تر می‌کنه.

چی داره براتون؟

پشتیبانی از روش‌های مختلف Pagination:

مثل Offset، Cursor، و Page-based.

سادگی در استفاده:
فقط با چند خط کد می‌تونید نیازهای pagination پروژه‌تون رو برطرف کنید.

مستقل از فریم‌ورک:
چه تو پروژه‌های ساده پایتونی، چه با فریم‌ورک‌هایی مثل Flask و FastAPI، به‌راحتی می‌تونید ازش استفاده کنید.

قابلیت شخصی‌سازی بالا:
تنظیمات و رفتارهاش قابل تغییر و تطبیق با پروژه شماست.

مستندات کامل و شفاف:
شروع کار با Pagify رو ساده و سریع می‌کنه.

هدف این پکیج اینه که توی مدیریت pagination وقت کمتری بذارید و روی بخش‌های اصلی پروژه تمرکز کنید.


پروژه اوپن‌سورسه!
خیلی خوشحال میشم اگه ایده‌ای دارید یا می‌خواید فیچر جدیدی اضافه کنید، توی توسعه این پکیج مشارکت کنید.

ـGitHub رو ببینید، تست کنید، و نظراتتون رو باهام درمیون بذارید:

مشاهده Pagify در GitHub

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

منتظر بازخوردهای ارزشمند شما هستم. 😊

#package #python


🔆 CHANNEL | GROUP
1👍1432🔥1
💎 ـPartial Functions در پایتون 💎

تا حالا شده یه تابع بنویسی که پر از آرگومان باشه و همیشه بخوای یه سری از اون آرگومان‌ها مقدار ثابتی داشته باشن؟ مثلا فرض کن توی یه پروژه مدام داری درخواست HTTP می‌فرستی و همیشه متد رو روی POST می‌ذاری. به جای تکرار این مقدار ثابت، Partial Functions به کمکت میان و کدتو خیلی حرفه‌ای‌تر می‌کنن.


🔎 ـPartial Functions چی هست؟

خیلی ساده، Partial Function بهت اجازه می‌ده یه نسخه سفارشی‌شده از تابع اصلی بسازی که یه سری از آرگومان‌هاش از قبل مقداردهی شده. این کار با functools.partial انجام می‌شه.

🧠 چرا Partial Functions مفیدن؟

سادگی و تمیزی کد: به
جای تکرار، یه بار آرگومان ثابت رو تعریف می‌کنی.


کاهش خطا:
آرگومان‌های ثابت توی یه جای مشخص مقداردهی می‌شن.



ایجاد نسخه‌های شخصی‌سازی‌شده از توابع:
بدون نیاز به تعریف تابع جدید.



🛠️ چطور Partial Functions بسازیم؟
from functools import partial  

def multiply(x, y):
return x * y

double = partial(multiply, y=2)
print(double(5)) # خروجی: 10



اینجا double نسخه‌ای از multiply شده که مقدار y همیشه 2 هست. فقط لازمه x رو بهش بدی.

🚀 کاربردهای Partial Functions

1⃣ ساده‌سازی توابع با آرگومان‌های زیاد
وقتی توابع زیادی با پارامترهای تکراری داری، Partial Functions می‌تونه کمکت کنه:

def send_request(method, url, headers, data):  
# ارسال درخواست
pass

post_request = partial(send_request, method='POST')
post_request(url='/api/data', headers={}, data={})

2⃣ انعطاف بیشتر با توابع دیگر
ـPartial Functions می‌تونه با توابعی مثل map و filter خیلی خوب کار کنه:

from functools import partial  

def power(base, exponent):
return base ** exponent

square = partial(power, exponent=2)

numbers = [1, 2, 3, 4]
squared_numbers = list(map(square, numbers))
print(squared_numbers) # خروجی: [1, 4, 9, 16]

3⃣ بهبود خوانایی کد در سیستم‌های بزرگ

وقتی پروژه‌هات پیچیده می‌شن، Partial Functions بهت کمک می‌کنن توابعی بسازی که واضح‌ترن:
from functools import partial  

def logger(log_level, message):
print(f"[{log_level}] {message}")

info_logger = partial(logger, log_level='INFO')
info_logger("This is an info message") # خروجی: [INFO] This is an info message

⚖️ مقایسه با دیگر روش‌ها
ـPartial Functions یه جایگزین سبک‌تر برای تعریف کلاس‌های خاص یا توابع جدیده. اما وقتی منطق خیلی پیچیده‌ای داری یا نیاز به شرط‌های مختلف هست، بهتره به جای Partial Functions از کلاس‌ها یا Wrapper Functions استفاده کنی.


✍️ جمع‌بندی
فهمیدیم Partial Functions ابزاری ساده اما قدرتمند در پایتون هستن که می‌تونن کدهای تکراری رو حذف کنن و انعطاف بالایی بهت بدن.

امید وارم مفید بوده باشه :)

#python #programing


🔆 CHANNEL | GROUP
👌132🔥2
🚀 معرفی FastAPI

ـ FastAPI یه فریم ورک پایتونیه که باهاش میشه داخل پایتون api توسعه داد که تازگیا خیلییی بین پایتون کارا سرو و صدا کرده.
ـFastAPI یه فریم‌ورک مدرن برای ساختن APIبا پایتون و ویژگی هایی مثل async/await که بهینه شده و... . خیلی از شرکت‌های بزرگ مثل Netflix و Uber برای توسعه سرویس‌هاشون از FastAPI استفاده می‌کنن، و دلیلش هم مشخصه: سریع، ساده و انعطاف‌پذیره.

💡 چرا FastAPI محبوبه؟
سریع‌ترین فریم‌ورک پایتون: FastAPI به لطف استفاده از Starlette و Pydantic، یکی از سریع‌ترین فریم‌ورک‌های پایتون حساب می‌شه.

کدنویسی سریع‌تر: تایپ‌هینت‌های پایتون باعث می‌شه نوشتن کدها هم سریع‌تر باشه و هم باگ‌های کمتری داشته باشی.

مستندات خودکار: یکی از بهترین ویژگی‌های FastAPI اینه که خودش به‌طور اتوماتیک با Swagger UI و ReDoc مستندات API رو برات می‌سازه.

پشتیبانی از async/await: فست خیلی خوب از کدونیسی async ساپورت میکنه و یکی از دلایل محبوبیتشه.

🛠 ـFastAPI و کار با دیتابیس
وقتی می‌خوای با دیتابیس کار کنی، معمولاً از ORMها استفاده می‌کنی. تو FastAPI دو تا گزینه معروف داریم:
ـSQLAlchemy
ـSQLModel
حالا کدوم بهتره؟ بیاین دقیق‌تر بررسی کنیم:

ـ🔍 SQLAlchemy؛ قدیمی و قدرتمند
ـSQLAlchemy یکی از معروف‌ترین ORMها برای پایتونه که زیاد استفاده میشه. انعطاف‌پذیری بالایی داره و برای پروژه‌های پیچیده و بزرگ گزینه خیلی خوبیه.
مزیت‌ها:
کنترل کامل روی کوئری‌ها و عملکرد دیتابیس
پشتیبانی از تراکنش‌ها و مدل‌های پیچیده
جامعه کاربری بزرگ و منابع آموزشی زیاد
چالش‌ها:
سینتکسش برای تازه‌کارها ممکنه سخت و پیچیده باشه
نوشتن کدهای زیاد برای مدل‌سازی

ـ🌀 SQLModel؛ ساده و مدرن
ـSQLModel یه کتابخونه جدیدتره که توسط خالق FastAPI یعنی Sebastián Ramírez توسعه داده شده. هدف SQLModel اینه که کار با دیتابیس رو ساده‌تر کنه و کدنویسی رو شبیه به Pydantic (برای ولیدیشن) بکنه.
مزیت‌ها:
سینتکس خیلی ساده و خوانا
پشتیبانی از تایپ‌هینت‌های پایتون
هماهنگی عالی با FastAPI
کمتر شدن کدنویسی و مدل‌سازی سریع
چالش‌ها:
هنوز نسبت به SQLAlchemy به بلوغ کامل نرسیده
برای پروژه‌های خیلی پیچیده ممکنه محدودیت‌هایی داشته باشه

مقایسه کدها
مدل‌سازی با SQLAlchemy:
from sqlalchemy import Column, Integer, String  
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)


مدل‌سازی با SQLModel:
from sqlmodel import SQLModel, Field  

class User(SQLModel, table=True):
id: int = Field(default=None, primary_key=True)
name: str = Field(index=True)


همون‌طور که می‌بینید، SQLModel خیلی تمیزتر و کوتاه‌تره و شبیه به Pydantic می‌شه.

🎯 بالاخره SQLAlchemy یا SQLModel؟
اگه تازه‌کار هستی یا پروژه‌ت کوچیکه و می‌خوای سریع کارت راه بیفته، SQLModel گزینه بهتریه. سینتکس ساده‌ای داره و هماهنگیش با FastAPI عالیه.
ولی اگه پروژه‌ت بزرگه یا نیاز به کنترل کامل و قابلیت‌های بیشتر ORM داری ، SQLAlchemy انتخاب بهتریه.
خلاصه:
پروژه‌های کوچیک و متوسط SQLModel
پروژه‌های بزرگ و پیچیده SQLAlchemy

امید وارم مفید بوده باشه :)

#python #fastapi


🔆 CHANNEL | GROUP
21👍5
خب خب خب Sentry چیه؟ 🔍

اگه برنامه نویسی میکنی احتمالاً این سناریو برات آشناست:
کلی وقت می‌ذاری، کد می‌نویسی، تست می‌کنی، همه‌چی درست کار می‌کنه. ولی وقتی می‌دی دست کاربر، یهو یه ارور عجیب غریب میاد که اصلاً نمی‌دونی از کجا دراومده اینجاست که Sentry وارد بازی میشه.

ـSentry چیه اصلاً؟
ـSentry یه ابزار خطایاب (Error Tracking) که کمک می‌کنه باگ‌ها و خطاهای پروژه‌ت رو همون لحظه‌ای که اتفاق میفتن، پیدا کنی.
این ابزار نه‌تنها ارورها رو جمع‌آوری می‌کنه، بلکه یه گزارش دقیق و کامل ازشون می‌ده؛ از جزئیات خطا گرفته تا شرایطی که باعث شده ارور پیش بیاد.
فرض کن یه باگ تو اپلیکیشن‌ ته که اصلاً قابل پیش‌بینی نبوده. به‌جای اینکه کاربر بیاد غر بزنه یا خودت بری تو لاگ‌ها دنبال مشکل بگردی، Sentry خودش ارور رو تشخیص می‌ده و گزارشش رو مستقیم برات می‌فرسته.

چرا Sentry محبوبه؟ 🌟
1⃣ گزارش ارور دقیق و کاربردی 🛠️
وقتی یه ارور اتفاق میفته، Sentry دقیقاً بهت میگه مشکل کجاست. جزئیاتی مثل:
فایل و خط کدی که ارور داده
نوع خطا (Exception)
اطلاعات مرورگر یا دستگاه کاربر
وضعیت سرور (مثلاً رم و CPU)
حتی مراحل درخواست کاربر تا لحظه‌ای که ارور رخ داده

2⃣ پشتیبانی از پلتفرم‌های مختلف 📱
هرچی فکرش رو بکنی، Sentry ساپورتش میکنه.
Backend: Python (جنگو، فلاسک و ...)، Node.js
Frontend: React، Vue.js
Mobile: اندروید و iOS
DevOps: Docker، Kubernetes


3⃣ دسته‌بندی ارورها 🗂️
وقتی تعداد ارورها زیاد بشه، Sentry اونا رو گروه‌بندی می‌کنه. مثلاً یه باگ اگه صد بار اتفاق بیفته، همشون رو زیر یه گزارش می‌ذاره که بتونی راحت مدیریت کنی.

4⃣ هشدار و نوتیفیکیشن 🔔

به محض اینکه یه ارور جدید اتفاق بیفته، سریع بهت خبر می‌ده. از ایمیل گرفته تا Slack یا حتی پیامک.


5⃣ـ Release Tracking 🚀
یه قابلیت جالبش اینه که می‌تونی ارورها رو به نسخه‌های پروژت وصل کنی و بفهمی کدوم تغییرات باعث مشکل شده.


6⃣ـPerformance Monitoring
علاوه بر ارورها، می‌تونی بفهمی اپلیکیشن کجاها کنده.


چطور از Sentry استفاده کنیم؟
ثبت‌نام کن:
تو سایت Sentry.io یه اکانت بساز. نسخه رایگانش برای شروع کافیه.

نصب کن:
ـSDK مخصوص زبان پروژه‌ت رو نصب کن. مثلاً برای Django این دستور کافیه:
 pip install sentry-sdk 

تنظیمش کن:
با چند خط کد ساده Sentry رو به پروژه وصل کن:
import sentry_sdk
sentry_sdk.init(
dsn="لینک DSN که Sentry می‌ده",
traces_sample_rate=1.0
)

ارورها رو مدیریت کن:
حالا هر اروری اتفاق بیفته، مستقیم تو داشبورد Sentry میره.

چند نکته مهم:
نسخه رایگان Sentry محدودیت داره (مثلاً تعداد ارورهای ماهانه). برای پروژه‌های بزرگ باید پلن‌های پولیش رو بگیری.
می‌تونی از مستندات رسمی کمک بگیری تا تنظیمات حرفه‌ای‌تر انجام بدی.

جمع‌بندی
اگه می‌خوای ارورهای پروژه‌ت رو حرفه‌ای مدیریت کنی و حتی قبل از اینکه کاربر بفهمه، خودت رفعشون کنی، Sentry بهترین انتخابه. هم راحت نصب میشه، هم کلی قابلیت خفن داره.
تا حالا از Sentry استفاده کردی؟ نظرت چیه؟ 👀

#programming #python #sentry



🔆 CHANNEL | GROUP
17
تا حالا کلی مطالب خفن و کاربردی تو کانال NinjaLearn براتون آماده کردیم و الان صدها مطلب مختلف و جذاب داریم.

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

این شما و این لیست دسته‌بندی‌های کانال🔻:

🦫 #go: آموزش‌ها و نکات کاربردی زبان گو

💻 #programming: مطالب برنامه نویسی

🐍 #python: ترفندها و نکات پایتونی

🦄 #django: مطالب فریم‌ورک جنگو

⚡️ #fastapi: مطالب فریم ورک فست

🌐 #web: مطالب مرتبط به وب

📡 #network: مطالب مرتبط به شبکه

🗂️ #db: معرفی و نکات دیتابیس

🔖 #reference: معرفی مقاله و ویدیو

📢 #notif: اطلاع رسانی ها

#question: سوالات جالب در برنامه نویسی

🎊 #event: رویداد هایی که معرفی کردیم

🎬 #movie: معرفی فیلم و سریال

📚 #book: معرفی کتاب‌های تخصصی

🤖 #AI: مطالب مرتبط به هوش مصنوعی

📊 #ml: مطالب مرتبط به یادگیری ماشین

🛠️ #backend: آموزش‌ها و ترفندهای بک‌اند

🔒 #security: نکات امنیتی

#devops: مطالب مرتبط به دواپس

📺 #YouTube: ویدیوهای چنل یوتیوب ما


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

اگه موضوع جدیدی به مطالب کانال اضافه بشه، حتماً تو این لیست قرار می‌گیره


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

NinjaLearn Banner 🥷🤝


#category



🔆 CHANNEL | GROUP
22👍1👎1🔥1
خب خب خب شی‌گرایی در پایتون🚀

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

1⃣ متاکلاس‌ها🕵️‍♂️
متاکلاس‌ها این امکان رو می‌دن که قبل از ایجاد یک کلاس، ساختارش رو کنترل کنی. می‌تونی مطمئن شی که قوانین خاصی رعایت شدن یا حتی رفتار کلاس رو دستکاری کنی.
مثال:
اطمینان از تعریف متد greet در کلاس
class Meta(type):
def __new__(cls, name, bases, dct):
# Ensure 'greet' method exists in the class
if 'greet' not in dct:
raise TypeError(f"Class '{name}' must define 'greet' method")
return super().__new__(cls, name, bases, dct)

class MyClass(metaclass=Meta):
def greet(self):
return "Hello, world!"

obj = MyClass()
print(obj.greet()) # Output: Hello, world!

💡 چی شد؟
متاکلاس Meta بررسی می‌کنه که متد greet توی هر کلاسی که ازش استفاده می‌کنه، حتماً تعریف شده باشه. با این کار، خطاها زودتر شناسایی می‌شن و کدت تمیزتر می‌مونه.
2⃣ ‏Composition به جای ارث‌بری 🔗
ترکیب یا Composition یک راه انعطاف‌پذیرتر برای ساختار دادن به کلاسهات هست. این روش بهت کمک می‌کنه وابستگی‌ها رو کم کنی و کدهات قابل نگهداری‌تر باشن.
مثال: تعریف ماشین با استفاده از موتور
class Engine:
def start(self):
return "Engine started"

class Car:
def __init__(self):
self.engine = Engine() # Engine is a part of Car

def start(self):
return self.engine.start() # Delegate starting to Engine

car = Car()
print(car.start()) # Output: Engine started

💡 چی شد؟
به جای این که ماشین از موتور ارث‌بری کنه، موتور به عنوان یک جزء در ماشین ترکیب شده. این یعنی موتور رو می‌تونی راحت عوض کنی بدون این که ساختار کلی ماشین به مشکل بخوره.
3⃣ بهینه‌سازی حافظه با slots 🧠
ویژگی های (attributes) هر آبجکت در پایتون به صورت پیش‌فرض در یک دیکشنری ذخیره می‌شن که حافظه زیادی مصرف می‌کنه. با slots می‌تونی این دیکشنری رو حذف کنی و مصرف حافظه رو کاهش بدی.
مثال: استفاده از slots برای بهینه‌سازی

class MyClass:
__slots__ = ['name', 'age'] # Restrict attributes to these two

obj = MyClass()
obj.name = "Alice"
obj.age = 25

💡 چی شد؟
ویژگی‌های آبجکت فقط محدود به name و age هستن و هیچ فضای اضافی برای دیکشنری داخلی استفاده نمی‌شه. این روش توی سیستم‌هایی با تعداد آبجکت زیاد، تفاوت بزرگی ایجاد می‌کنه.

4⃣ ‏Abstract Base Classes 🎯
کلاس‌های پایه انتزاعی (ABC) تضمین می‌کنن که کلاس‌های فرزند متدهای مشخصی رو پیاده‌سازی کنن. این کار طراحی رو مطمئن‌تر و کدها رو خواناتر می‌کنه.
مثال: طراحی یک کلاس پایه برای اشکال هندسی
from abc import ABC, abstractmethod

class Shape(ABC):
@abstractmethod
def area(self):
"""Calculate the area of the shape"""
pass

class Circle(Shape):
def __init__(self, radius):
self.radius = radius

def area(self):
return 3.14 * self.radius ** 2 # Area formula for a circle

circle = Circle(5)
print(circle.area()) # Output: 78.5

💡 چی شد؟
کلاس Shape تضمین می‌کنه که همه‌ی اشکال فرزند متد area رو داشته باشن. بدون این متد، ساختن کلاس فرزند امکان‌پذیر نیست.

جمع‌بندی
این نکات فقط نوک کوه یخه اگه می‌خوای عمیق تر بشی، کتاب Fluent Python یکی از بهترین منابعه.

#programming #python #oop



🔆 CHANNEL | GROUP
1👍14🔥21
class MetaLoggernew
def __new__(meta_cls, cls_name, bases, cls_dict):
print(f"داریم کلاس {cls_name} رو می‌سازیم!")
new super().__new__(meta_cls, cls_name, bases, clsinit

def __init__(cls, cls_name, bases, cls_dict):
print(f"کلاس {cls_name} ساخته شده و آماده استفاده است!")

initsuper().__init__(cls_name, bases, cls_dict)

class Example(metaclass=MetaLogger):
pass

# خروجی:
# داریم کلاس Example رو می‌سازیم!
# کلاس Example ساخته شده و آماده استفاده است

5⃣ مزایا و چالش‌های متاکلاس‌ها 💡⚠️
مزایا:
کنترل دقیق روی ساختار کلاس‌ها:
می‌توانید رفتار و ساختار کلاس‌ها رو به دلخواه تغییر بدید.
کاهش تکرار کد:
الگوها و قوانین مشترک رو در یک نقطه متمرکز می‌کنید.

ایجاد چارچوب‌های پیچیده:
برای ساخت فریمورک‌های پیشرفته (مثل Django یا SQLAlchemy) این تکنیک فوق‌العاده کاربردیه.

چالش‌ها:
پیچیدگی در درک:
متاکلاس‌ها مفهومی پیشرفته هستند و نیاز به زمان و تجربه برای درک کامل دارند.

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

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

7⃣ جمع‌بندی نهایی
متاکلاس‌ها به شما این امکان رو میدن که قبل از ساخته‌شدن کلاس، رفتار و ساختار اون رو تغییر بدید. اگه نیاز به کنترل دقیق روی ساختار کد دارید یا میخواید چارچوب‌های پیچیده‌ای بسازید، متاکلاس‌ها ابزار قدرتمندی هستن. اما همزمان باید به خاطر داشته باشید که این جادوی عمیق نیازمند دانش و دقت بالایی هست.

امید وارم مفید بوده باشه :)

#⃣ #python #programming



🥷 CHANNEL | GROUP
👍102
خب خب خب دکوریتورها (Decorators) در پایتون: تغییر رفتار توابع و کلاس‌ها 🐍

سلام دوستان امروز می‌خوایم در مورد یکی از ویژگی‌های خیلی قوی و در عین حال جذاب پایتون صحبت کنیم:
دکوریتورها. این قابلیت به شما اجازه می‌ده تا بدون دست زدن به کد اصلی توابع یا کلاس‌ها، رفتارشون رو تغییر بدید.

1⃣ دکوریتورها چیستند؟ 🤔
دکوریتورها در پایتون، توابع یا کلاس‌هایی هستن که مثل یه "بسته‌بندی" عمل می‌کنن. یعنی، شما یه تابع یا کلاس رو می‌گیرید، اون رو به یه دکوریتور می‌فرستید، دکوریتور رفتارش رو تغییر می‌ده (یا بهبود می‌بخشه) و نسخه تغییر یافته رو برمی‌گردونه.

مثال ساده:
def simple_decorator(func):
def wrapper(*args, **kwargs):
print("قبل از اجرای تابع")
result = func(*args, **kwargs)
print("بعد از اجرای تابع")
return result
return wrapper

@simple_decorator
def greet(name):
print(f"سلام، {name}!")

greet("علی")

اینجا دکوریتور simple_decorator قبل و بعد از اجرای تابع greet پیام چاپ می‌کنه. یعنی بدون اینکه کد اصلی تابع رو دست بزنیم، رفتارش تغییر پیدا می‌کنه.

2⃣ نحوه‌ی کارکرد دکوریتورها 🔧

🔻 دکوریتور به عنوان یک تابع
در واقع، دکوریتورها توی پایتون همون توابعی هستن که یه تابع یا کلاس رو به عنوان ورودی می‌گیرن و یه نسخه تغییر یافته برمی‌گردونن. وقتی از علامت @ استفاده می‌کنید، پایتون به طور خودکار این کار رو انجام می‌ده.

🔻 مراحل استفاده از دکوریتور:
تعریف دکوریتور:
دکوریتور یه تابعه که یه تابع ورودی می‌گیره و نسخه بهبود یافته یا تغییر یافته رو برمی‌گردونه.

اعمال دکوریتور:
با قرار دادن علامت @ قبل از تعریف تابع یا کلاس، دکوریتور روی اون اعمال می‌شه.

اجرای تابع دکوریتور:
وقتی تابع دکوریت شده فراخوانی می‌شه، اول تابع "بسته‌بندی" (wrapper) اجرا می‌شه و بعد تابع اصلی.

🔻 مثال دکوریتور بر روی کلاس
دکوریتورها فقط برای توابع نیستن؛ می‌تونن رفتار کلاس‌ها رو هم تغییر بدن. مثلاً:
def add_str(cls):
# افزودن یه متد برای نمایش
def __str__(self):
return f"{cls.__name__} با ویژگی‌ها: {self.__dict__}"
cls.__str__ = __str__
return cls

@add_str
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

p = Person("سارا", 28)
print(p) # خروجی: Person با ویژگی‌ها: {'name': 'سارا', 'age': 28}

اینجا دکوریتور add_str متد str
رو به کلاس Person اضافه می‌کنه، بدون اینکه کد داخل کلاس رو تغییر بده.

3⃣ مزایای استفاده از دکوریتورها
کنترل دقیق روی ساختار کد:
دکوریتورها به شما این امکان رو می‌دن تا بدون دست زدن به منطق اصلی تابع یا کلاس، رفتارشون رو تغییر بدید. این موضوع برای توسعه چارچوب‌های پیچیده خیلی مفیده.

اجرای الگوهای تکراری (DRY):
می‌تونید کدهای تکراری مثل ثبت رویدادها، اعتبارسنجی یا مدیریت استثناها رو توی یه مکان متمرکز کنید.

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

4⃣ چالش‌های استفاده از دکوریتورها ⚠️
درک اولیه سخت‌تر:
برای کسانی که تازه شروع کردن، مفهوم دکوریتورها ممکنه گیج‌کننده باشه. برای درک کاملش نیاز به مطالعه و تمرین داره.

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

ترکیب با سایر مفاهیم:
استفاده همزمان از دکوریتورها با مفاهیم پیشرفته مثل متاکلاس‌ها یا توابع بازگشتی می‌تونه باعث پیچیدگی‌های اضافه بشه.

جمع‌بندی
دکوریتورها ابزار خیلی قدرتمندی در پایتون هستن که به شما امکان می‌دن رفتار توابع و کلاس‌ها رو بدون تغییر کد اصلی تغییر بدید. این قابلیت مخصوصاً توی پیاده‌سازی چارچوب‌های پیچیده و کنترل دقیق روی ساختار کد کاربرد زیادی داره. اگرچه درک اولیه‌ش ممکنه کمی سخت باشه، اما با تمرین و استفاده از مثال‌های عملی، دکوریتورها می‌تونن ابزار بسیار موثری برای بهبود و انعطاف‌پذیری کدتون باشن.

#⃣ #python #programming



🥷 CHANNEL | GROUP
14👍6👌2