Я хотел составить список экземпляров классов. Я использую Python 3.12.4.
Я пытался:
class MyClass:
def __init__ (self,MyClassData):
self.MyClassData = MyClassData
MyClassList = [""]
MyClassList.append(MyClass("hello"))
def ReadClassData () :
for i in MyClassList:
return MyClassList[i].MyClassData
print(ReadClassData())
и он возвращает:
Traceback (most recent call last):
File "C:/Users/malac/OneDrive/Documents/Python/Tests/Instance In List.py", line 9, in <module>
print(ReadClassData())
File "C:/Users/malac/OneDrive/Documents/Python/Tests/Instance In List.py", line 8, in ReadClassData
return MyClassList[i].MyClassData
TypeError: list indices must be integers or slices, not str
Меня смущает последняя часть. Я думал, что [i]
— целое число?
Попробуйте напечатать i
внутри цикла. Первый элемент MyClassList
— это ""
.
И независимо от того, что первый элемент неправильный, i
уже является объектом в списке, а не индексом.
Пожалуйста, не добавляйте ответы в сам вопрос. Либо примите ответ, который помог вам решить проблему, либо опубликуйте ответ самостоятельно.
Вот пошаговое описание того, что происходит:
class MyClass:
def __init__ (self,MyClassData):
self.MyClassData = MyClassData
Вы определили класс MyClass
. Все идет нормально
MyClassList = [""]
MyClassList.append(MyClass("hello"))
MyClassList
— это список, инициируемый одним элементом (пустая строка ""
), к которому немедленно добавляется объект MyClass("hello")
. MyClassList
сейчас ["", MyClass("hello")]
def ReadClassData () :
for i in MyClassList:
return MyClassList[i].MyClassData
print(ReadClassData())
Цикл for перебирает MyClassList
, получает свой первый элемент, т. е. ""
, и присваивает его i
, так что i
теперь ""
. Вот почему отображается ошибка, потому что вы пытаетесь получить доступ к элементу списка MyClassList
с индексом str
.
С вашим кодом есть две проблемы:
Вы инициализируете свой список пустой строкой, т.е. (MyClassList = [""]
)
Вместо этого напишите (MyClassList = []
)
Вы напрямую перебираете содержимое списка, т.е.
(for i in MyClassList
)
поэтому при возврате объекта с использованием индексов (MyClassList[i]
) здесь i
приводит к первому элементу списка, а не к целому числу.
Исправьте это, используя: range(len(MyClassList))
Ваш код после исправления:
class MyClass:
def __init__ (self,MyClassData):
self.MyClassData = MyClassData
MyClassList = []
MyClassList.append(MyClass("hello"))
def ReadClassData () :
for i in range(len(MyClassList)):
return MyClassList[i].MyClassData
print(ReadClassData())
Нет,
i
не является целым числом. Это строка, как сказано в сообщении. Если бы вы не поместили строку в качестве первого элемента в свой «список экземпляров классов» (непонятно, почему вы это сделали), вместо этого это был бы экземплярMyClass
. Выполните базовую отладку, например. используйте pythontutor.com