Python-类对象特殊方法__len__、len()

  1. 类对象特殊方法__len__、len()

类对象特殊方法__len__、len()

内置函数len()用于返回对象的长度

>>> len([1, 2, 3, 4, 5])
5
>>> len('abcde')
5
>>> len({'a':1, 'b':2, 'c':3})
3

在上面的例子中,内置函数len()的实参都是内置类对象的实例对象,例如:
[1, 2, 3, 4, 5]是内置类对象list的一个实例对象
{'a':1, 'b':2, 'c':3}是内置类对象dict的一个实例对象

内置函数len()的实参在默认情况下,不能是自定义类对象的实例对象,如果我们想要内置函数len()的实参可以是自定义类对象的实例对象,必须在自定义类对象中实现特殊方法__len__()。这样,调用内置函数len()时,在其内部会自动调用实参所对应类对象的特殊方法__len__()

>>> class MyClass(object):
...     pass
...
>>>
>>> len(MyClass())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'MyClass' has no len()
>>>



>>> class MyClass(object):
...     def __len__(self):
...         return 20
...
>>> len(MyClass())
20

之所以内置函数len()的实参可以使上述内置类对象的实例对象,是因为上述的内置独享中都实现了特殊方法__len__()

>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
>>>
>>> dir(dict)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']
>>>
>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com