برنامه نویسی

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

Summarize this content to 400 words in Persian Lang

آشنایی با روش های جادویی در پایتون

متدهای جادویی در پایتون که به آن نیز معروف است رعد و برق متدها (چون در ابتدا و انتهای نام خود دارای زیرخط های دوگانه هستند)، به ما اجازه می دهند تا رفتار اشیاء خود را برای عملیات های مختلف تعریف کنیم. آنها رفتار سفارشی را فعال می کنند و می توانند کلاس های ما را مانند انواع داخلی عمل کنند. در این وبلاگ دسته بندی های مختلف روش های جادویی را بررسی می کنیم، توضیحات مفصلی ارائه می دهیم و مثال های کاربردی و موارد استفاده را بیان می کنیم.

1. روش های دسترسی ویژگی

این روش‌های جادویی نحوه دسترسی، اصلاح یا حذف ویژگی‌های اشیاء شما را کنترل می‌کنند.

__getattr__ و __getattribute__

مثال: دسترسی به ویژگی سفارشی با ورود به سیستم

class LoggedAttributes:
def __init__(self, name):
self.name = name

def __getattr__(self, item):
print(f”Accessing non-existent attribute: {item}”)
return None

def __getattribute__(self, item):
print(f”Getting attribute: {item}”)
return super().__getattribute__(item)

# Usage
obj = LoggedAttributes(“Alice”)
print(obj.name) # Output: Getting attribute: name\nAlice
print(obj.age) # Output: Accessing non-existent attribute: age\nNone

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: ثبت دسترسی ویژگی در یک سناریوی اشکال زدایی برای ردیابی زمان و نحوه دسترسی یا اصلاح ویژگی ها.

__setattr__ و __delattr__

مثال: اصلاح ویژگی سفارشی با اعتبارسنجی

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

def __setattr__(self, key, value):
if key == “age” and value 0:
raise ValueError(“Age cannot be negative”)
super().__setattr__(key, value)

def __delattr__(self, item):
if item == “name”:
raise AttributeError(“Can’t delete attribute ‘name'”)
super().__delattr__(item)

# Usage
p = Person(“Alice”, 30)
p.age = 25 # Works fine
# p.age = -1 # Raises ValueError
# del p.name # Raises AttributeError

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: اجرای قوانین اعتبارسنجی یا محدودیت ها هنگام تنظیم یا حذف ویژگی ها.

2. روش های کانتینری

این روش‌های جادویی به اشیاء شما اجازه می‌دهند تا مانند ظروف (فهرست، فرهنگ لغت و غیره) رفتار کنند.

__len__، __getitem__، __setitem__، __delitem__، و __iter__

__len__: طول ظرف را برمی گرداند.
__getitem__: یک مورد را در یک شاخص یا کلید معین بازیابی می کند.
__setitem__: یک مورد را در یک شاخص یا کلید معین تنظیم می کند.
__delitem__: یک مورد را در یک شاخص یا کلید مشخص حذف می کند.
__iter__: یک شی تکرار کننده را برمی گرداند.

مثال: شیء شبیه فهرست سفارشی

class CustomList:
def __init__(self):
self._items = []

def __len__(self):
return len(self._items)

def __getitem__(self, index):
return self._items[index]

def __setitem__(self, index, value):
self._items[index] = value

def __delitem__(self, index):
del self._items[index]

def __iter__(self):
return iter(self._items)

def append(self, item):
self._items.append(item)

# Usage
cl = CustomList()
cl.append(1)
cl.append(2)
cl.append(3)
print(len(cl)) # Output: 3
print(cl[1]) # Output: 2
for item in cl:
print(item) # Output: 1 2 3

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

3. روش های عددی و مقایسه ای

این متدها نحوه تعامل اشیاء کلاس شما با عملیات عددی و مقایسه را تعریف می کنند.

روش های عددی

__add__، __sub__، __mul__، __truediv__، __floordiv__، __mod__، __pow__: عملیات حسابی را تعریف کنید.

مثال: کلاس اعداد پیچیده سفارشی

class Complex:
def __init__(self, real, imag):
self.real = real
self.imag = imag

def __add__(self, other):
return Complex(self.real + other.real, self.imag + other.imag)

def __sub__(self, other):
return Complex(self.real – other.real, self.imag – other.imag)

def __repr__(self):
return f”({self.real} + {self.imag}i)”

# Usage
c1 = Complex(1, 2)
c2 = Complex(3, 4)
print(c1 + c2) # Output: (4 + 6i)
print(c1 – c2) # Output: (-2 + -2i)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: پیاده سازی انواع عددی سفارشی مانند اعداد مختلط، بردارها یا ماتریس ها.

روش های مقایسه

__eq__، __ne__، __lt__، __le__، __gt__، __ge__: عملیات مقایسه را تعریف کنید.

مثال: اجرای کل سفارش برای یک کلاس سفارشی

from functools import total_ordering

@total_ordering
class Book:
def __init__(self, title, author):
self.title = title
self.author = author

def __eq__(self, other):
return (self.title, self.author) == (other.title, other.author)

def __lt__(self, other):
return (self.title, self.author) (other.title, other.author)

def __repr__(self):
return f”{self.title} by {self.author}”

# Usage
book1 = Book(“Title1”, “Author1”)
book2 = Book(“Title2”, “Author2”)
books = [book2, book1] print(sorted(books)) # Output: [Title1 by Author1, Title2 by Author2]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: امکان مرتب‌سازی یا مقایسه اشیاء سفارشی، مفید در ساختارهای داده مانند heaps، درخت‌های جستجوی دودویی، یا صرفاً هنگام مرتب‌سازی فهرست‌های اشیاء سفارشی.

4. روش ظروف: مورد استفاده عملی

دیکشنری سفارشی با کلیدهای کوچک و بزرگ

ایجاد یک شی دیکشنری مانند که کلیدها را به عنوان حساس به حروف بزرگ و کوچک در نظر می گیرد.

مثال: دیکشنری غیر حساس به حروف بزرگ

class CaseInsensitiveDict:
def __init__(self):
self._data = {}

def __getitem__(self, key):
return self._data[key.lower()]

def __setitem__(self, key, value):
self._data[key.lower()] = value

def __delitem__(self, key):
del self._data[key.lower()]

def __contains__(self, key):
return key.lower() in self._data

def keys(self):
return self._data.keys()

def items(self):
return self._data.items()

def values(self):
return self._data.values()

# Usage
cid = CaseInsensitiveDict()
cid[“Name”] = “Alice”
print(cid[“name”]) # Output: Alice
print(“NAME” in cid) # Output: True

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: ایجاد فرهنگ لغت که در آن کلیدها باید به‌عنوان حروف کوچک و بزرگ، مفید برای مدیریت ورودی‌های کاربر، تنظیمات پیکربندی و غیره در نظر گرفته شوند.

نتیجه

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

آشنایی با روش های جادویی در پایتون

متدهای جادویی در پایتون که به آن نیز معروف است رعد و برق متدها (چون در ابتدا و انتهای نام خود دارای زیرخط های دوگانه هستند)، به ما اجازه می دهند تا رفتار اشیاء خود را برای عملیات های مختلف تعریف کنیم. آنها رفتار سفارشی را فعال می کنند و می توانند کلاس های ما را مانند انواع داخلی عمل کنند. در این وبلاگ دسته بندی های مختلف روش های جادویی را بررسی می کنیم، توضیحات مفصلی ارائه می دهیم و مثال های کاربردی و موارد استفاده را بیان می کنیم.

1. روش های دسترسی ویژگی

این روش‌های جادویی نحوه دسترسی، اصلاح یا حذف ویژگی‌های اشیاء شما را کنترل می‌کنند.

__getattr__ و __getattribute__

مثال: دسترسی به ویژگی سفارشی با ورود به سیستم

class LoggedAttributes:
    def __init__(self, name):
        self.name = name

    def __getattr__(self, item):
        print(f"Accessing non-existent attribute: {item}")
        return None

    def __getattribute__(self, item):
        print(f"Getting attribute: {item}")
        return super().__getattribute__(item)

# Usage
obj = LoggedAttributes("Alice")
print(obj.name)  # Output: Getting attribute: name\nAlice
print(obj.age)   # Output: Accessing non-existent attribute: age\nNone
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: ثبت دسترسی ویژگی در یک سناریوی اشکال زدایی برای ردیابی زمان و نحوه دسترسی یا اصلاح ویژگی ها.

__setattr__ و __delattr__

مثال: اصلاح ویژگی سفارشی با اعتبارسنجی

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

    def __setattr__(self, key, value):
        if key == "age" and value  0:
            raise ValueError("Age cannot be negative")
        super().__setattr__(key, value)

    def __delattr__(self, item):
        if item == "name":
            raise AttributeError("Can't delete attribute 'name'")
        super().__delattr__(item)

# Usage
p = Person("Alice", 30)
p.age = 25  # Works fine
# p.age = -1  # Raises ValueError
# del p.name  # Raises AttributeError
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: اجرای قوانین اعتبارسنجی یا محدودیت ها هنگام تنظیم یا حذف ویژگی ها.

2. روش های کانتینری

این روش‌های جادویی به اشیاء شما اجازه می‌دهند تا مانند ظروف (فهرست، فرهنگ لغت و غیره) رفتار کنند.

__len__، __getitem__، __setitem__، __delitem__، و __iter__

  • __len__: طول ظرف را برمی گرداند.

  • __getitem__: یک مورد را در یک شاخص یا کلید معین بازیابی می کند.

  • __setitem__: یک مورد را در یک شاخص یا کلید معین تنظیم می کند.

  • __delitem__: یک مورد را در یک شاخص یا کلید مشخص حذف می کند.

  • __iter__: یک شی تکرار کننده را برمی گرداند.

مثال: شیء شبیه فهرست سفارشی

class CustomList:
    def __init__(self):
        self._items = []

    def __len__(self):
        return len(self._items)

    def __getitem__(self, index):
        return self._items[index]

    def __setitem__(self, index, value):
        self._items[index] = value

    def __delitem__(self, index):
        del self._items[index]

    def __iter__(self):
        return iter(self._items)

    def append(self, item):
        self._items.append(item)

# Usage
cl = CustomList()
cl.append(1)
cl.append(2)
cl.append(3)
print(len(cl))  # Output: 3
print(cl[1])    # Output: 2
for item in cl:
    print(item)  # Output: 1 2 3
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

3. روش های عددی و مقایسه ای

این متدها نحوه تعامل اشیاء کلاس شما با عملیات عددی و مقایسه را تعریف می کنند.

روش های عددی

  • __add__، __sub__، __mul__، __truediv__، __floordiv__، __mod__، __pow__: عملیات حسابی را تعریف کنید.

مثال: کلاس اعداد پیچیده سفارشی

class Complex:
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    def __add__(self, other):
        return Complex(self.real + other.real, self.imag + other.imag)

    def __sub__(self, other):
        return Complex(self.real - other.real, self.imag - other.imag)

    def __repr__(self):
        return f"({self.real} + {self.imag}i)"

# Usage
c1 = Complex(1, 2)
c2 = Complex(3, 4)
print(c1 + c2)  # Output: (4 + 6i)
print(c1 - c2)  # Output: (-2 + -2i)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: پیاده سازی انواع عددی سفارشی مانند اعداد مختلط، بردارها یا ماتریس ها.

روش های مقایسه

  • __eq__، __ne__، __lt__، __le__، __gt__، __ge__: عملیات مقایسه را تعریف کنید.

مثال: اجرای کل سفارش برای یک کلاس سفارشی

from functools import total_ordering

@total_ordering
class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def __eq__(self, other):
        return (self.title, self.author) == (other.title, other.author)

    def __lt__(self, other):
        return (self.title, self.author)  (other.title, other.author)

    def __repr__(self):
        return f"{self.title} by {self.author}"

# Usage
book1 = Book("Title1", "Author1")
book2 = Book("Title2", "Author2")
books = [book2, book1]
print(sorted(books))  # Output: [Title1 by Author1, Title2 by Author2]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: امکان مرتب‌سازی یا مقایسه اشیاء سفارشی، مفید در ساختارهای داده مانند heaps، درخت‌های جستجوی دودویی، یا صرفاً هنگام مرتب‌سازی فهرست‌های اشیاء سفارشی.

4. روش ظروف: مورد استفاده عملی

دیکشنری سفارشی با کلیدهای کوچک و بزرگ

ایجاد یک شی دیکشنری مانند که کلیدها را به عنوان حساس به حروف بزرگ و کوچک در نظر می گیرد.

مثال: دیکشنری غیر حساس به حروف بزرگ

class CaseInsensitiveDict:
    def __init__(self):
        self._data = {}

    def __getitem__(self, key):
        return self._data[key.lower()]

    def __setitem__(self, key, value):
        self._data[key.lower()] = value

    def __delitem__(self, key):
        del self._data[key.lower()]

    def __contains__(self, key):
        return key.lower() in self._data

    def keys(self):
        return self._data.keys()

    def items(self):
        return self._data.items()

    def values(self):
        return self._data.values()

# Usage
cid = CaseInsensitiveDict()
cid["Name"] = "Alice"
print(cid["name"])  # Output: Alice
print("NAME" in cid)  # Output: True
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مورد استفاده عملی: ایجاد فرهنگ لغت که در آن کلیدها باید به‌عنوان حروف کوچک و بزرگ، مفید برای مدیریت ورودی‌های کاربر، تنظیمات پیکربندی و غیره در نظر گرفته شوند.

نتیجه

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

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

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا