Python的魔法函数不是内建函数的底层函数吗?为什么在重写魔法函数时还是可以调用内建函数?这样不会一直递归陷入死循环吗?
像这样:
def bool(self):
return bool(abs(self))
为什么可以这样使用?
你 def __len__(self): 中 len(self.values) 是对self.values调用len()
是调用self.values对象的 __len__(), 不是调用自己self对象的 __len__() 不是递归
如果你 def __len__(self): 中写成 len(self) 对self调用len()
才是调用自己self对象的 __len__() 这才会形成无限递归调用
你上边的return bool(abs(self))也是一样, 是对abs()的返回值调用 bool(), 不是调用自己self对象的 __bool__() 也不是递归
例子
class A:
def __init__(self, v):
self.values = v
def __len__(self):
return len(self.values)
def __bool__(self):
return bool(self)
a = A([1,2,3])
print(len(a)) #返回3
print(bool(a)) #是无限递归调用
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
你这哪是魔法函数?是自定义的bool函数,调用内建函数bool
我试了一下,我cv对着,这个一提交 bool 前后的两个下划线就没了
def --len--(self):
return len(self.values)
看一下这个,就当他是两个下划线,我看到过这样的话:
special method 就是一类有特殊名字 special names的方法,此特殊名字就是前后有双下划线,此类方法实质就是内建函数的底层函数,也即 len()函数调用的是__len()函数,abs()调用的是__abs()
len()是内建函数,但是写在魔法函数(特殊函数)--len--下,我想不明白,按我所想这不是自己调自己吗???它不会报错,而且是写在类下的