lst = [1, 2, 3]
print(lst.__len__()) # 3
print(len(lst)) # 3
هردو جواب یکسان میدن، آیا تفاوتی دارند ؟ آیا میشه همیشه از مجیک متد های متناظر استفاده کرد؟ امروز میخوایم 4 تا از تفاوت ها رو بررسی کنیم.str(), bool(), len(), repr(), hash(), ...
ما معادل magic method اون رو استفاده کنیم:__str__(), __bool__(), __len__(), __repr__(), __hash__(), ...
یه صفحه از کدمون میشه پر از underscore که هم زشته هم ناخوانا مخصوصا اگه ترکیب هم بشن باهم...class C:
def __len__(self):
return 'salam'
obj = C()
print(obj.__len__()) # Fine
print(len(obj)) # Error
پایتون سر دومین print ارور داد ! البته که باید هم میداد، دلیلش منطقی هست وقتی ما طول یه آبجکتی رو میخوایم انتظار "عدد" داریم نمیشه طول آبجکت ما "سلام" باشه ولی توی اولی کامل ignore شده.class C:
def __str__(self):
return 10
obj = C()
print(obj.__str__()) # Fine
print(str(obj)) # Error
3- مورد بعدی توی comparison operator ها (نه arithmetic operator ها مثل ضرب و ...):class C:
def __lt__(self, other):
print('called')
class D:
pass
obj1 = C()
obj2 = D()
obj2 > obj1
obj2.__gt__(obj2)
دو نمونه داریم به اسم obj1 و obj2 ، از طرفی میدونیم magic method عه متناظر با علامت < متد عه __gt__ هست. ما برای هیچکدوم از کلاس ها __gt__ رو پیاده سازی نکردیم ولی:__lt__ رو پیاده سازی کرده پس اون رو کال میکنه.from timeit import timeit
print(timeit("len('salam')", number=10000000))
print(timeit("'salam'.__len__()", number=10000000))
# 0.4709385__len__ توی namespace عه اون نمونه میگرده. (توی 10 میلیون بار اجرا 0.2 ثانیه تفاوت یعنی هیچی).