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

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
مورد استفاده عملی: ایجاد فرهنگ لغت که در آن کلیدها باید بهعنوان حروف کوچک و بزرگ، مفید برای مدیریت ورودیهای کاربر، تنظیمات پیکربندی و غیره در نظر گرفته شوند.
نتیجه
متدهای جادویی راه قدرتمندی برای سفارشی کردن رفتار اشیاء شما در پایتون ارائه میکنند. درک و استفاده مؤثر از این روشها میتواند کلاسهای شما را بصریتر کند و بهطور یکپارچه با توابع و عملگرهای داخلی پایتون ادغام شود. چه در حال پیادهسازی انواع عددی سفارشی، کانتینرها، یا الگوهای دسترسی ویژگیها باشید، روشهای جادویی میتوانند تا حد زیادی انعطافپذیری و عملکرد کد شما را افزایش دهند.