我可以使我的 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
属性的所有内容,并且会掩盖可迭代对象的实际位置。但如果它适合您的用例,那就去做吧。
因为我在做一个遗传算法,我有一个 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
属性的所有内容,并且会掩盖可迭代对象的实际位置。但如果它适合您的用例,那就去做吧。