__len__方法
1、 注意:__len__ 方法一般与 len(对象) 方法搭配使用。即先在__len__方法中说明需要求类中的哪个属性(假如是属性a)的长度,当使用 len(对象A) 方法时会得到对象A的该属性(就是属性a)的长度。
2、 当执行到 len(对象) 方法时,会自动调用对象的__len__方法,表示用来求该对象的某个属性(变量)的元素的个数。如果类中没有定义__len__方法,就会报类型错误。
why is TypeError
至于为什么会TypeError,是因为python中的 len() 方法,默认是用来求字符串 len(str)、元组 len(tuple_1)、列表 list(list_1) 的元素个数的(len方法括号中是列表、元组或字符串)。现在你用来求对象的某个属性的元素个数(len方法括号中是对象),相当于这个方法还没有被定义和重载,当然会报类型错误。
3、再次强调,len(对象) 方法,是用来求对象的 某个属性(变量) 的元素的个数,会自动调用对象的__len__(self) 方法
4、要让 len() 函数正常工作,类中必须提供一个特殊方法__len__,它返回元素的个数
请看下面的三个实验对比
对比一:求对象A中成员变量a的元素个数
# main.py
class Test(object):
def __init__(self, arg):
self.a = arg
self.b = [1, 2, 3, 4]
def __len__(self):
return len(self.a) # 求对象中成员变量a的元素个数,这里会输出12
if __name__ == '__main__':
pass
pass
A = Test('Hello, world')
print(len(A)) # 这里,函数 len(A) 用来求对象A中成员变量a的元素个数,会自动调用对象的__len__方法
# 使用 len(对象) 方法时,如果对象中没有实现 __len__ 方法,就会报类型错误。
结果:12
对比二:求对象A中成员变量b的元素个数
# main.py
class Test(object):
def __init__(self, arg):
self.a = arg
self.b = [1, 2, 3, 4]
def __len__(self):
return len(self.b) # 求对象中成员变量b的元素个数,这里会输出4
if __name__ == '__main__':
pass
pass
A = Test('Hello, world')
print(len(A)) # 这里,函数 len(A) 用来求对象A中成员变量b的元素个数,会自动调用对象的__len__方法
# 使用 len(对象) 方法时,如果对象中没有实现 __len__ 方法,就会报类型错误。
结果:4
对比三:求对象A中成员变量b的元素个数,类中没有实现 __len__方法,会报类型错误
# main.py
class Test(object):
def __init__(self, arg):
self.a = arg
self.b = [1, 2, 3, 4]
# def __len__(self):
# return len(self.b)
if __name__ == '__main__':
pass
pass
A = Test('Hello, world')
print(len(A)) # 这里,函数 len(A) 用来求对象A中成员变量b的元素个数,会自动调用对象的__len__方法
# 使用 len(对象) 方法时,如果对象中没有实现 __len__ 方法,就会报类型错误。
报错: