ویژگی‌های دیگر

اصلاح شده

2026-07-25

متدهای ویژه (Dunder / Magic Methods)

  • متدهایی با دو آندرلاین در ابتدا و انتهای نام (__name__)
  • پایتون خودش در موقعیت‌های خاص این متدها رو صدا می‌زنه
متد صدا زده می‌شه وقتی مثال
__init__ ساخت شیء Dog("Rex")
__str__ print(obj) یا str(obj) نمایش خوانا برای انسان
__repr__ نمایش رسمی/دیباگی شیء معمولاً برای برنامه‌نویس
__len__ len(obj) طول شیء
__eq__ obj1 == obj2 مقایسه برابری
__add__ obj1 + obj2 جمع دو شیء
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"({self.x}, {self.y})"

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)

p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1)              # (1, 2)   -> از __str__
print(p1 == p2)         # False    -> از __eq__
print(p1 + p2)          # (4, 6)   -> از __add__

متد کلاسی و متد استاتیک

نوع دکوراتور پارامتر اول دسترسی به
متد نمونه (معمولی) self داده‌های شیء
متد کلاسی @classmethod cls خود کلاس
متد استاتیک @staticmethod ندارد نه شیء نه کلاس، فقط تابع مرتبط
class Dog:
    count = 0

    def __init__(self, name):
        self.name = name
        Dog.count += 1

    @classmethod
    def get_count(cls):
        return cls.count

    @staticmethod
    def is_valid_name(name):
        return len(name) > 0

print(Dog.is_valid_name("Rex"))   # True
d1 = Dog("Rex")
d2 = Dog("Buddy")
print(Dog.get_count())            # 2

کلاس‌های انتزاعی و Duck Typing

  • در پایتون معمولاً نوع دقیق شیء مهم نیست، مهم اینه که رفتار موردنیاز رو داشته باشه
  • به این ویژگی Duck Typing می‌گن: “اگه مثل اردک راه بره و مثل اردک صدا کنه، اردکه”
class Duck:
    def sound(self):
        print("Quack!")

class Dog:
    def sound(self):
        print("Woof!")

def make_it_sound(animal):
    animal.sound()   # فرقی نمی‌کنه از چه کلاسی باشه، فقط باید sound() داشته باشه

make_it_sound(Duck())
make_it_sound(Dog())

بازبینی خودکار اشیاء

  • dir(obj) : لیست همه‌ی متدها و ویژگی‌های یک شیء
  • vars(obj) یا obj.__dict__ : دیکشنری ویژگی‌های نمونه (instance attributes)
p = Point(1, 2)
print(vars(p))    # {'x': 1, 'y': 2}

نکته کلاسی جمع‌بندی

  • استفاده از متدهای ویژه، کد رو با ساختارهای درونی پایتون (مثل print(), +, len()) سازگار و طبیعی‌تر می‌کنه — این یعنی کلاس‌های خودمون هم می‌تونن مثل انواع داخلی پایتون (لیست، رشته و…) رفتار کنن