【问题标题】:Python len() doesn't work but __len__ does with class holding a numpy arrayPython len() 不起作用,但 __len__ 对持有 numpy 数组的类起作用
【发布时间】: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


【解决方案1】:

如 cmets 中所写,您会发现 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__()

【讨论】:

  • 基本上我想返回arr.shape。但是我不想返回一个元组,而是想返回一个 numpy 数组
  • 如果你想要一个数组形状,实现你自己的方法。不要滥用(和违反)__len__ 协议。
  • 您可以使用len() 返回任何不同于正整数的值。没什么好说的...
  • 有道理,尽管这意味着我必须重构我的一些代码..
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 2021-08-24
  • 1970-01-01
  • 2016-12-02
相关资源
最近更新 更多