我打算展示不直接使用魔法方法的一些好处:
1- 可读性:
使用像len() 这样的内置函数比相关的魔术/特殊方法__len__() 更具可读性。想象一个充满魔法方法而不是内置函数的源代码......成千上万的下划线......
2- 比较运算符:
class C:
def __lt__(self, other):
print('__lt__ called')
class D:
pass
c = C()
d = D()
d > c
d.__gt__(c)
我还没有为这两个类实现__gt__,但是在d > c 中,当python 看到该类D 没有__gt__ 时,它会检查类C 是否实现@987654330 @。确实如此,所以我们在输出中得到'__lt__ called',而d.__gt__(c) 的情况并非如此。
3- 额外检查:
class C:
def __len__(self):
return 'boo'
obj = C()
print(obj.__len__()) # fine
print(len(obj)) # error
或:
class C:
def __str__(self):
return 10
obj = C()
print(obj.__str__()) # fine
print(str(obj)) # error
如您所见,当 python 隐式调用该魔术方法时,it does some extra checks 也是如此。
4- 这是最不重要的,但与__len__() 相比,在诸如str 等内置数据类型上使用len() 会提供一点速度:
from timeit import timeit
string = 'abcdefghijklmn'
print(timeit("len(string)", globals=globals(), number=10_000_000))
print(timeit("string.__len__()", globals=globals(), number=10_000_000))
输出:
0.5442426
0.8312854999999999