python 中的 __len__(self) 方法

__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__ 方法,就会报类型错误。

报错:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45580017/article/details/124553090