Using len() and def __len__(self): to build a class

后端 未结 2 1428
栀梦
栀梦 2020-12-29 02:59

Just curious,

Is there any difference (advantages and disadvantages) between using len() or def __len__() when I build a class? And which i

相关标签:
2条回答
  • 2020-12-29 03:36

    There is a huge difference.

    The __len__() method is a hook method. The len() function will use the __len__ method if present to query your object for it's length.

    The normal API people expect to use is the len() method, using a .len attribute instead would deviate from that norm.

    If the length of self.data is not expected to change, you can always cache the length in an attribute and have .__len__() return that attribute.

    class foo(object):
        def __init__(self, obs=None):
            if obs is None:  # provide a default if no list was passed in.
                obs = []
            self.data = obs
            self.max = max(obs)
            self.min = min(obs)
            self._data_len = len(obs)
    
        def __len__(self):
            return self._data_len
    
    0 讨论(0)
  • 2020-12-29 03:37

    There are several differences:

    1. Only the second approach will give you the familiar len(obj) syntax for foo. The first will require obj.len().
    2. If the length of self.data can change post-construction, only the second version will reflect the new length.
    0 讨论(0)
提交回复
热议问题