| کانال توسعه‌دهندگان پایتون |
6.61K subscribers
38 photos
2 videos
4 files
43 links
⭕️ کانال توسعه‌دهندگان پایتون دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
💠 متدهای خاص در کلاس ها

🔸 در پایتون، Magic methodها یا همان Dunder methodها متدهای خاصی هستند که با استفاده از نام‌های خاصی که با _‌_ شروع و به‌‌پایان می‌رسند، به کلاس‌ها رفتارهای پیش فرضی می‌دهند. این نوع متدها به شما این امکان را می‌دهند که کلاس‌های خود را بهتر و با عملکرد بالاتر بنویسید.

🔹 داندرمتدها می‌توانند برای پیاده‌سازی اعمال ریاضی، مقایسه، شیوه ترکیب و تعریف عملکردهای دیگر برای کلاس‌ها استفاده شوند. برای مثال با تعریف متد __add__ می‌توانیم عمل جمع را برای دو شیء در کلاس تعریف شده، به صورت خودکار انجام دهیم. همچنین با تعریف متد __str__ می‌توانیم رشته‌ای را که نشان دهنده نحوه نمایش یک شیء است، تعریف کنیم.

🔸 در کل، Magic method ها در پایتون به کاربران اجازه می‌دهند که رفتار و عملکرد کلاس‌های خود را به شکلی سفارشی و مشخصی تعریف کنند و این باعث افزایش انعطاف پذیری و خوانایی کد می‌شود.

🌀 در ادامه، به معرفی بخش به بخش این نوع از متدها خواهیم پردازیم.

#MagicMethod #DunderMethod #Operator
#داندرمتدها #عملگرها


✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍8
💠 داندرمتد ها
💠 بخش اول
(موارد مرتبط با عملگرهای ریاضی و مقایسه)

🌀 برای درک بهتر موارد مرتبط با این قسمت، پیشنهاد می‌شود پست مربوط به عملگرها را مطالعه کنید.

🔰 از magic methodهای مرتبط با عملگرهای ریاضی در پایتون برای تعریف عملگرهای ریاضی برای کلاس‌های سفارشی استفاده می‌شود.

🔸 به عنوان مثال، شما می‌توانید با تعریف متد __add__ برای یک کلاس، عملگر جمع + را برای اشیاء این کلاس تعریف کنید. به همین ترتیب، با تعریف دیگر متدهای مربوط به سایر عملگرهای ریاضی، می‌توانید رفتار خاصی را برای این عملگرها در کلاس‌های خود تعریف کنید.

🔸 در کل، استفاده از این magic methodها به شما امکان می‌دهد که به کلاس خود عملکردی مشابه کلاس‌های دیگر در پایتون بدهید و با تعریف رفتارهای خاص برای عملگرهای ریاضی، این عملکرد را بهبود بخشید.

🔹 داندرمتدهای مرتبط به این بخش عبارتند از:
1. __add__(self, other) : +
2. __sub__(self, other) : -
3. __truediv__(self, other) : /
4. __mul__(self, other) : *
5. __floordiv__(self, other) : //
6. __mod__(self, other) : %
7. __pow__(self, other) : **

🔘 برای مثال، میدانیم که در یک رشته، عملگر "-" به‌صورت استاندارد پشتیبانی نمی‌شود زیرا تعریف نشده است. با این حال، با ارث‌بری از کلاس str و اضافه کردن این متد به آن می‌توانیم از آن استفاده کنیم. برای ورودی های غیرقابل‌قبول هم ارورهایی درنظر می‌گیریم. یعنی:

class Str(str):
def __sub__(self, __value: str) -> str:
if not isinstance(__value, str):
raise TypeError(f"value must be str, not {type(__value).__name__}")

elif self.endswith(__value):
return self.removesuffix(__value)

else:
raise ValueError(f'"{self}" does not end with "{__value}"')

Str("DevelopixPython") - "Python" # "Developix"


🔰 از داندرمتدهای مرتبط با عملگرهای مقایسه‌ در پایتون برای تعریف رفتار خاصی برای عملگرهای مقایسه‌ای مانند >, <, >=, <=, == و != استفاده می‌شود. با تعریف این متدها، می‌توانید رفتار خاصی را برای مقایسه دو شیء با هم تعریف کنید و در نتیجه از این مقایسه ها به شکلی خاصی استفاده کنید.

🔸 به عنوان مثال، شما می‌توانید با تعریف متد __eq__ دو شیء را برای برابری باهم مقایسه کنید. همچنین، با تعریف دیگر متدها مانند __gt__ و __lt__، می‌توانید دو شیء را برای مقایسه بزرگتری یا کوچکتری با هم مقایسه کنید.

🔸 در کل، استفاده از magic method های مرتبط با عملگرهای مقایسه در پایتون به شما امکان می‌دهد که رفتار خاصی برای مقایسه دو شیء با هم تعریف کنید.

🔹 داندرمتدهای مرتبط به این بخش عبارتند از:
1. __lt__(self, other) : <
2. __le__(self, other) : <=
3. __gt__(self, other) : >
4. __ge__(self, other) : >=
5. __eq__(self, other) : ==
6. __ne__(self, other) : !=

🔘 فرض کنید می‌خواهید دو مقدار را که تنها در نوع داده‌ با هم تفاوت دارند با یکدیگر مقایسه کنید (برای مثال 123 و "123"). در حالت معمول، اگر از عملگر "==" برای مقایسه این دو داده استفاده کنید، مقدار False برگردانده می‌شود. با این حال، می‌توانیم این متد را override کنیم تا اگر ورودی یک عدد صحیح و مقدار آن‌ها برابر بود، اول داده را تبدیل به str کرده و بعد آن را به متد والد بدهد.
یعنی:
class Str(str):
def __eq__(self, __value: object) -> bool:
if isinstance(__value, int):
return super().__eq__(__value.__str__())

return super().__eq__(__value)

Str("123") == 123 # True

#MagicMethod #DunderMethod #Operator
#داندرمتدها #عملگرها

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍5🔥2
💠 داندرمتد ها
💠 بخش دوم
(موارد مرتبط با عملگرهای تخصیص و بیتی)

🌀 برای درک بهتر موارد مرتبط با این قسمت، پیشنهاد می‌شود پست مربوط به عملگرها را مطالعه کنید.

🔰 از magic methodهای مرتبط با عملگرهای بیتی در پایتون برای تعریف رفتاری خاص برای عملگرهای بیتی مانند &، | و ... استفاده می‌شود.

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

🔹 داندرمتدهای مرتبط به این بخش عبارتند از:
1. __and__(self, other) : &
2. __or__(self, other) : |
3. __invert__(self) : ~
4. __xor__(self, other) : ^
5. __rshift__(self, other) : >>
6. __lshift__(self, other) : <<

🔘 فرض کنید قصد دارید دو رشته را با یکدیگر مقایسه کنید و تمامی حروف مشترک آنها را به صورت یک رشته خروجی دهید، به طوری که عملکرد آن مشابه عملکرد استاندارد برای اشتراک در set و dict باشد. در این صورت، شما می‌توانید برای عملگر "&"، متد مربوطه را تعریف کنید که با فراخوانی آن، تمامی حروف مشترک بین دو رشته(یا Iterable) ورودی را درقالب str برگردانید. یعنی:

class Str(str):
def __and__(self, __value: object) -> str:
if isinstance(__value, (Iterable, str)):
return "".join(
letter
for letter in self
if letter in __value
)

raise TypeError(
f"value must be Iterable or str, not {type(__value).__name__}")

Str("Developix") & "Dpx" # "Dpx"

🔰 عملگرهای تخصیص مانند +=، -=، *= و ...، برای انجام عملیات‌های ریاضی، بیتی و ... بر روی یک متغیر استفاده می‌شوند.

🔸 این داندرمتدها، هنگامی که از عملگرهای تخصیص استفاده می‌شود، به صورت خودکار فراخوانی می‌شوند و نتیجه عملیات را در همان شیء ذخیره می‌کنند. به عنوان مثال، اگر a یک شیء از یک کلاس باشد، عملگر += با استفاده از متد __iadd__، مقدار a را با یک مقدار دیگر جمع کرده و نتیجه را در همان a ذخیره می‌کند.

🔹 داندرمتدهای مرتبط به این بخش عبارتند از:
1. __iadd__(self, other) : +=
2. __isub__(self, other) : -=
3. __itruediv__(self, other) : /=
4. __imul__(self, other) : *=
5. __ifloordiv__(self, other) : //=
6. __imod__(self, other) : %=
7. __ipow__(self, other) : **=
8. __iand__(self, other) : &=
9. __ior__(self, other) : |=
10. __ixor__(self, other) : ^=
11. __irshift__(self, other) : >>=
12. __ilshift__(self, other) : <<=
13. __radd__(self, other) : +=
14. __rmul__(self, other) : *=
15. __rfloordiv__(self, other) : //=
16. __rmod__(self, other) : %=
17. __rpow__(self, other) : **=
18. __rand__(self, other) : &=
19. __ror__(self, other) : |=
20. __rxor__(self, other) : ^=
21. __rrshift__(self, other) : >>=
22. __rlshift__(self, other) : <<=
23. __rsub__(self, other) : -=
24. __rtruediv__(self, other) : /=

🔘 بر اساس مثالی که برای عملگر "-" ارائه دادیم، می‌توانیم کد مشابهی برای عملگر "-=" نوشته و از آن استفاده کنیم. در اینجا، فقط با یک تغییر، در صورتی که ورودی نوع int باشد، ابتدا آن را به str تبدیل می‌کنیم و سپس بررسی می‌کنیم که آیا این رشته با ورودی به پایان می‌رسد یا خیر. یعنی:

class Str(str):
def __isub__(self, __value: object) -> bool:
if isinstance(__value, str):
return self.__sub__(__value)

if isinstance(__value, int):
__value = __value.__str__()

elif not isinstance(__value, str):
raise TypeError(f"value must be str, not {type(__value).__name__}")

if self.endswith(__value):
return self.removesuffix(__value)

raise ValueError(f'"{self}" does not end with "{__value}"')

var = Str("123")
var -= 3 # var = "12"

#MagicMethod #DunderMethod #Operator
#داندرمتدها #عملگرها

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍101
💠 داندرمتد ها
💠 بخش سوم
(Descriptor)

🔰 به طور کلی Descriptorها به شما اجازه می‌دهند تا رفتارهای خاصی را برای متغیرهای یک آبجکت تعریف کنید. این رفتارها ممکن است شامل تعیین، بازیابی، تغییر و حذف مقادیر متغیرهای آن باشند.

🔸 برای تعریف این رفتارها، شما به magic methodهایی نیاز دارید که برای هر نوع descriptor می‌تواند متفاوت باشند. به عنوان مثال، اگر شما به دنبال ایجاد یک descriptor با قابلیت خواندن و نوشتن هستید، باید از __get__ و __set__ استفاده کنید.

🔹 داندرمتدهای مرتبط به این بخش عبارتند از:
1. __get__(self, instance, owner)
2. __set__(self, instance, value)
3. __delete__(self, instance)

🔘 دو کلاس به نام های Python و Developix تعریف می‌کنیم. در کلاس Python، اتریبیوتی به نام group_name تعریف شده است که مقدار اولیه آن برابر با نام کلاس است. وقتی از داندرمتد __get__ استفاده می‌شود، با استفاده از group_name، لینک گروه برگردانده می‌شود و در داندرمتد __set__ با استفاده از value، مقدار group_name تغییر می‌کند.

class Python:
def __init__(self):
self.group_name = self.__class__.__name__

def __get__(self, object_instance, owner_class=None):
return object_instance.gp_link_form.format(self.group_name)

def __set__(self, object_instance, value):
self.group_name = value

class Developix:
Python = Python()

def __init__(self):
self.gp_link_form = "https://t.me/IR{0}GP"

Developix = Developix()
print(Developix.Python) # https://t.me/IRPythonGP

Developix.Python = "PythonNewName"
print(Developix.Python) # https://t.me/IRPythonNewNameGP

#MagicMethod #DunderMethod #Operator
#داندرمتدها #عملگرها

✍🏻 *ژنرال*

💎 Channel: @DevelopixPython
👍101👎1