python 类中为什么要用:len() 方法
__len__()
的作用是返回容器中元素的个数,要想使 len()
函数成功执行,必须要在类中定义 __len__()
。而 len()
的执行指的是在命令窗口输入 len()
,而在程序中一般情况下即使不定义 __len__()
也能成功执行。主要看在命令窗口的行为,看输入是 len(对象) 还是 len(对象.属性)。
使用 len(function)
时,实际上调用的就是 object.__len__
方法。
- 案例1:
class CountList(object):
def __init__(self, *args):
self.values = [x for x in args]
self.values2 = [x for x in args] * 2
def __len__(self):
return len(self.values)
c1 = CountList(1, 2, 3, 4, 5)
>>> len(c1)
> 5
>>> len(c1.values2)
> 10
以上程序的类中定义了 __len__()
函数,*args
时可变长度的参数,它接收到数据后打包成元组,再利用 for 循环将数据传递给列表。当在命令窗口写入 len(c1)
时,由于定义的 __len__()
的返回值时返回具体的实例对象的列表长度,所以在命令窗口直接输入 len(c1)
就可以输出列表的长度,而类中封装的 len() 函数直接决定了返回的到底是哪个属性的长度,我们一般将其定义为实例化中元素的个数。
- 案例2:
class CountList(object):
def __init__(self, *args):
self.values = [x for x in args]
self.values2 = [x for x in args] * 2
c1 = CountList(1, 2, 3, 4, 5)
>>> len(c1)
> Traceback (most recent call last):
TypeError: object of type 'CountList' has no len()
>>> len(c1.values)
> 5
>>> len(c1.values2)
> 10
如果没有定义 __len__()
,那再命令窗口输入 len(c1)
会提示出错。
对于类而言,len()
函数没有办法直接计算类的长度,因为在类中包含着众多的属性以及方法,len() 函数不知道应该计算哪一个,如果在类中没有定义 __len__()
方法来指明程序到底该计算哪个属性的长度时,在终端我们必须采用 len(对象.属性) 才能得到我们想要的结果。
但是就封装性而言,还是定义 __len__()
比较好,因为用户无需知道具体的属性是什么,只需要一个实例化的对象即可。