ویژگیهای دیگر
متدهای ویژه (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()) سازگار و طبیعیتر میکنه — این یعنی کلاسهای خودمون هم میتونن مثل انواع داخلی پایتون (لیست، رشته و…) رفتار کنن