【发布时间】:2019-01-13 12:40:25
【问题描述】:
这是我的最小工作示例:
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
我尝试调试,直到最后一切都很好,只是我得到了一个错误..
【问题讨论】:
-
__len__()should return a single integer。你想达到什么目标? -
如果你想看看,我正在 GitHub (github.com/MauroCE/PythonBRMLtoolbox/tree/master) 上处理这个项目。基本上,我想实现一个概率表类。这个类包含一个 numpy 数组作为属性。我想做的就是,如果你将
Array类实例化为 a = Array([1, 2], np.array([[0.4, 0.6],[0.3, 0.7]]))` 然后通过调用len(a)你会得到np.array([[0.4, 0.6],[0.3, 0.7]])的形状 -
那你为什么不实现一个
.shape属性呢? -
你不能那样做。
len强制它返回int。如果它没有返回int,则解释器调用对象的__index__方法(如果存在的话)。您看到的错误是因为 numpy 数组__index__方法拒绝将 1 元素数组转换为整数。
标签: python python-3.x python-2.7 oop