当我想从类中返回对象并且可以同时打印此结果时,我该怎么办。
我这样做了
class Engine:
def __init__(self, mylist):
self._mylist = list(mylist)
def __str__(self) -> str:
return ','.join(el.__str__() for el in self._mylist)
def __repr__(self):
return self._mylist
但是当我这样做时:
p = Engine(lst)
print(p)
for x in p:
print("Element", x)
我得到:
element1, element2, element3
TypeError: 'Engine' object is not iterable
我应该怎么做才能打印此结果并像对象一样遍历它?
答案 0 :(得分:2)
您可以引用一个类变量来使其工作。默认情况下,您不能遍历整个对象。正确的方法是遍历您传递的列表,该列表现在是一个对象变量。如果您运行,它将起作用:
lst = [1, 2, 3, 4, 5]
p = Engine(lst)
print(p)
for ix in p._mylist:
print("Element", ix)
但是我猜您正在寻找另一种解决方案,因为您将列表命名为_mylist
,这通常意味着不应从外部访问此变量。
因此,您可以改为将对象本身变成可迭代的。为此,您需要定义__iter__
dunder方法,并在将其视为迭代器时定义其行为。
def __iter__(self):
return iter(self._mylist)
class Engine:
def __init__(self, mylist):
self._mylist = list(mylist)
def __str__(self) -> str:
return ','.join(el.__str__() for el in self._mylist)
def __repr__(self):
return self._mylist
def __iter__(self):
return iter(self._mylist)
lst = [1, 2, 3, 4, 5]
p = Engine(lst)
print(p)
for ix in p:
print("Element", ix)
1,2,3,4,5
Element 1
Element 2
Element 3
Element 4
Element 5