我可以使我的 class 仅可迭代以使用其可迭代属性之一吗?

Can I make my class iterable only to use one of its iterable attributes?

因为我在做一个遗传算法,我有一个 Individu class:

class Individu:
  genotype: List[int]
  code: List[int]
  phenotype: List[List[Client]]
  fitness: float

大多数时候程序中只使用属性genotype(用于交叉父代或计算适应度)。

现在,我可以让 Individu 可迭代,而不是总是在我需要使用它时写 p1.genotype[] ,这样我就可以写 p1[] 还是一个坏主意?

我觉得这会让我的程序更干净,但同时可能会让其他人感到困惑,或者 'break' 某种编程最佳实践。

您似乎在谈论索引,而不是迭代本身。索引由 __getitem__ 方法处理,而迭代由 __iter__/iter 处理。您可以为 class 定义这些方法,以将工作转发给 genotype 属性:

def __getitem__(self, key): return self.genotype[key]
def __iter__(self): return iter(self.genotype)

我个人不会这样做,因为这种间接是额外的工作,可能不是您想要转发到 genotype 属性的所有内容,并且会掩盖可迭代对象的实际位置。但如果它适合您的用例,那就去做吧。