' __len __()的魔力是什么?

时间:2018-04-19 20:46:56

标签: python

所以列表对象没有简单的长度属性len,而是#34;魔法" __len__()。为什么首选在列表而不是其属性上使用函数len()?函数len()不仅仅是查询__len__()吗?为什么绕道而没有my_list.len()

1 个答案:

答案 0 :(得分:5)

__len__视为可以为任何对象自定义的方法可能会有所帮助。 len函数与使用.__len__().len()的部分原因是python旨在成为一种教授初学者的语言。对于初学程序员来说,理解使用length函数来获取列表的长度似乎非常直观。

例如:

class MyObject:
     def __len__(self):
          return 100

a = MyObject()
assert len(a) == 100

所以它只是所有python对象的构造,你可以设置如何计算长度。这个例子并不实用,但是如果你有一个Circle对象,你可能希望长度为它的周长,即

 class Circle:
     def __init__(self, radius):
         self.radius = radius

     def __len__(self):
         return 3.14 * self.radius * 2

len作为函数和方法的好处是能够将filter-reduce-reduce len转换为数组。写起来很容易:

map(len, [[1,2], [4,5,6]])

但是,如果你真的认为.len()是一种呈现对象长度的有吸引力的方法,你可以添加一个方法。

class MyObject:
    def __len__(self):
        return 10
    def len(self):
        return len(self)