首页 > 解决方案 > 类的索引成员作为python中的列表

问题描述

假设我有一个简单的类

class Foo:
  def __init__(bar):
    self.x = transform1(bar)
    self.y = transform2(bar)

我现在对生成一个类感兴趣,我可以在其中将一个可迭代的 for 传递给初始化程序并返回一个我可以访问成员bar的实例,并且喜欢大小为 的迭代,即Fooxybar

x = [1, 2, 3]
foo = Foo(x)
plt.plot(foo.x, foo.y)

我知道一个人可以轻松做到

foo = [Foo(elem) for elem in x]
plt.plot([elem.x for elem in foo], [elem.y for elem in foo])

但这感觉很冗长,可能效率不高。我可以粗略地想象一个带有 numpy 结构化数组的解决方案,但我只是好奇是否有任何标准解决方案。也许使用元类。谷歌搜索主要是关于如何获取一个类或类似类的所有成员的列表的结果。

如果有人甚至可以提出一种允许索引对象或其成员的解决方案,那foo 伟大的。

标签: pythonlistoopmetaclassclass-decorator

解决方案


您可以使用单个循环而不是 2 来执行此操作:

class Foo:
    def __init__(self, bar):
        self.xs = []
        self.ys = []
        for elem in bar:
            self.xs.append(elem.x) 
            self.ys.append(elem.y)

map您可以使用and隐藏循环zip

class Foo:
    def __init__(self, bar):
        self.xs, self.ys = zip(*map(lambda e: (e.x, e.y), bar))

推荐阅读