Python子类中能否实现循环?如何让子类实例支持for循环遍历?
如何让Python子类实例支持for循环遍历?
要让自定义类的实例能被for循环遍历,需要让它成为可迭代对象。Python中实现可迭代有两种常用方式,下面针对你的代码给出具体解决方案:
方法1:实现__iter__方法(推荐)
通过在Character类中定义__iter__方法,返回一个迭代器来指定遍历的内容。比如你想遍历实例的firstname、lastname、edad三个属性,可以用生成器(yield)来实现:
class Valkyrie: def __init__(self, fname, lname): self.firstname = fname self.lastname = lname def printname(self): print(self.firstname, self.lastname) class Character(Valkyrie): def __init__(self, fname, lname, age): super().__init__(fname, lname) self.edad = age def intro(self): print(self.firstname, self.lastname, self.edad) def introd(self): print(self.firstname, self.lastname,",", self.edad) def __iter__(self): # 按顺序返回要遍历的属性值 yield self.firstname yield self.lastname yield self.edad # 测试遍历 kk = Character("Kiana", "Kaslana", 16) for x in kk: print(x) # 其他原有代码 rm = Character("Mei", "Raiden", 18) bz = Character("Bronya", "Zaychick", 14) kk.intro() kk.introd() rm.intro() bz.intro()
运行后,for循环会依次输出Kiana、Kaslana、16,符合预期。
方法2:实现__getitem__方法
如果实现了__getitem__方法,Python会自动将对象视为可迭代对象,它会从下标0开始反复调用这个方法,直到抛出IndexError为止:
class Character(Valkyrie): # 保留原有__init__、intro、introd方法 def __getitem__(self, index): # 将需要遍历的属性存入列表,根据下标返回对应值 attrs = [self.firstname, self.lastname, self.edad] return attrs[index]
这种方式同样能让for循环正常遍历实例的属性。
补充说明
如果你想遍历实例的所有属性(包括继承来的),可以修改__iter__方法为:
def __iter__(self): for value in self.__dict__.values(): yield value
但这样会包含所有实例属性,若有不需要的属性,建议还是像方法1那样明确指定遍历内容。
内容的提问来源于stack exchange,提问作者Regine Fontanilla
相关产品推荐
相关产品推荐

