Python len()无法正常工作,但__len__可以处理包含numpy数组的类

时间:2018-08-06 14:08:16

标签: python python-3.x python-2.7 oop

这是我最小的工作示例:

class One:
    def __init__(self, arr):
        self.arr = arr

    def __len__(self):
        return np.array([len(self.arr)]).astype(np.int8)

    def size():
        return self.__len__()



class Two(One):
    def __init__(self, arr):
        super().__init__(arr)

# Create an instance of the second class
a = Two(np.array([0.4, 0.6]))
# I can call a.size()
print("a.size(): ", a.size())
# I can call a.__len__()
print("a.__len__(): ", a.__len__())
# I cannot call len(a)
print("len(a): ", len(a))

所以基本上我有一个类One,它有一个构造函数__init__,一个方法__len__应该实现len(One),最后是另一个叫做size的方法,调用__len__方法。

如您所见,我可以轻松地致电a.__len__()a.size(),但不能致电len(a),因为我得到了:

TypeError: only integer scalar arrays can be converted to a scalar index

我尝试调试,直到一切顺利,直到我得到一个错误。

1 个答案:

答案 0 :(得分:3)

如评论中所述,您会发现here如下:

  

__len__()应该返回对象的长度,即> = 0的整数。

目前尚不清楚len()会返回什么内容,但是此代码可以很好地工作,例如:

class One:
    def __init__(self, arr):
        self.arr = arr

    def __len__(self):
        return len(self.arr)

    def size(self):
        return self.__len__()