【问题标题】:Non-iterable Object After \__init__ Array in Python ClassPython类中\__init__数组之后的不可迭代对象
【发布时间】:2019-12-26 14:18:48
【问题描述】:

假设我想创建一个 python 类,它表现为另一个类的数组。在调用 __init__ 时,它会将自己识别为一个数组(可迭代);但是,当我通过其他方法再次调用它时,甚至通过索引调用时,对象变得不可迭代。我想知道我错了哪一部分,或者python类有DO和DON'T?

最后但同样重要的是,这是一种将一种对象类型简化为另一种对象类型的尝试(尝试从一个类转换为另一个类)。也许下面的代码会给出更好的说明。

示例如下: 假设我有一个对象 FOO

FOO.name = "john"
FOO.records[0].a = 1
FOO.records[0].b = 2
FOO.records[1].a = 4
FOO.records[1].b = 5

我创建了一个 python 类

class BAR:
    __init__(self, record):
        self.a = int(record.a)
        self.b = int(record.b)

和另一个想将 BAR 类存储为数组的类

class BARS:
    __init__(self,bars):
        self = numpy.array([]) # regardless the array type whether python native or Numpy it does not work
        for item in bars:
            self = numpy.append(self, BAR(item))

所以我希望这段代码执行的是,如果我调用

A = BARS(FOO.records)

我会得到一个可迭代的 A。但这不起作用,但如果我在 BARS __init__ 中调用 SELF,它会将 SELF 视为可迭代对象。

如果不希望 python 类以这种方式运行,至少我希望你能帮助指出我,实现它的另一种逻辑和 python 方式是什么。

【问题讨论】:

  • 首先要把numpy放到这里。如果您尝试存储自定义对象,它不会给您带来任何好处。使用列表
  • 第二,你不能只给self做作业。您需要一些属性名称。除此之外,我不确定我是否正确地遵循了您正在尝试做的事情。您需要 __iter__ 使自定义类可迭代
  • 对于列表,和 Numpy,我很清楚。对于__iter__,这是我听说过的,但从未探索过。会看看。感谢您的评论。

标签: python arrays python-3.x class


【解决方案1】:

也许在上面的评论提示后回答我自己的问题会很好。

事实证明,在课堂上暗杀self 本身就是一个不要(愚蠢的我试图获得捷径)。

要实现一个可迭代的类,需要__iter__ 方法以及__next____getitem__ 来实现(也许还有其他一些方法,但现在让我们坚持这三个)。

所以,上面的代码应该是这样的

class BARS:
    def __init__(self, records):
        self.records = [] # Use list for simplicity
        for record in records:
            self.records.append(BAR(record))

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n < len(self.records):
            result = self.records[self.n]
            self.n += 1
            return result
        else:
            raise StopIteration

    def __getitem__(self, key):
        return self.records[key]    

最终,这将产生一个迭代和索引可访问对象。

【讨论】:

  • 不错的转机。新用户接受反馈并围绕它进行实际研究是不寻常的
  • 感谢您的反馈 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2014-04-26
  • 2014-07-11
  • 2022-11-09
  • 2012-02-12
  • 2013-08-03
相关资源
最近更新 更多