حالا که وراثت را بلدی، وقتش است کلاسهایی بسازی که «پایتونیک» حس شوند: سازندهٔ جایگزین، ویژگیِ محاسبهشده، عملگرهای طبیعی و چرخهٔ عمر شفاف.
سازندهٔ جایگزین با classmethod
class Person:
def __init__(self, name, birth_year):
self.name = name
self.birth_year = birth_year
@classmethod
def from_string(cls, text):
"""سازندهٔ جایگزین: 'سارا-1380' → Person."""
name, year = text.split("-")
return cls(name, int(year))
@staticmethod
def is_adult(age):
"""ابزار خالص بدون نیاز به نمونه یا کلاس."""
return age >= 18
classmethod به کلاس (cls) دسترسی دارد پس ارثبری را حفظ میکند؛ staticmethod به هیچکدام کاری ندارد و فقط یک تابعِ مرتبچیدهشده در فضای کلاس است. جاوا اینها را static صدا میکند اما معنایشان یکی نیست: در پایتون classmethod چندریختیِ سطح کلاس هم دارد.
ویژگی: متد به شکل ویژگی
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def area(self):
return 3.14159 * self.radius ** 2
c = Circle(2)
print(c.area) # بدون پرانتز — مثل خواندن ویژگی
اشتباه رایج
property فقط راه شیک نوشتن getter جاواست.
تصحیح
property قرارداد را حفظ میکند: امروز ویژگی ساده است، فردا محاسبه میشود، و کد بیرون عوض نمیشود. قدرتش در پایداری رابط است، نه اختصار.
متدهای جادویی: رفتار طبیعی
class Vector:
def __init__(self, x, y):
self.x, self.y = x, y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __len__(self):
return 2
def __repr__(self):
return f"Vector({self.x}, {self.y})"
def __eq__(self, other):
return (self.x, self.y) == (other.x, other.y)
قانون طلایی: __repr__ برای توسعهدهنده (ترجیحاً چیزی شبیه سازنده) و __str__ برای کاربر نهایی. اگر فقط یکی را مینویسی، __repr__ را بنویس.
دیتاکلاس: کلاسهای دادهای بدون تکرار
from dataclasses import dataclass
@dataclass
class Student:
name: str
student_id: int
gpa: float = 0.0
یک خط دکوراتور، سازنده و __repr__ و __eq__ معقول میسازد. وقتی کلاست بیشتر «داده» است تا «رفتار»، دیتاکلاس انتخاب اول است.
چرخهٔ عمر شیء و زبالهروبی
شیء با __init__ به دنیا میآید و وقتی هیچ ارجاعی به آن نماند، شمارندهٔ ارجاع CPython آزادش میکند (رفتار خاص پیادهسازی CPython است، نه تضمین زبان). چرخههای ارجاعی (A به B، B به A) را زبالهروب چرخهای جمع میکند.
سنجش فهم — طراحی کلاس
۰ از ۲ پاسخ داده شده