Я пытаюсь передать элементы в список класса для создания объекта в Python. Когда я, позже, использую тот же список, чтобы попытаться вызвать этот объект, я получаю ошибку: объект 'str' не имеет атрибута 'name'.
Я использовал Python некоторое время, но новичок в OOP. Удивление, если это касается области действия объекта>
class SwimmingWithTheFishes:
def __init__(self, typeofshark):
self.name = typeofshark
def __str__(self):
return f"This is the method shark: {self.name}"
def reporting(self, shark):
name = shark.name
print(f"This is a method shark: {name}")
def print_return(self):
return f'{self.name}'
def main():
# sharklist = [{"name": "mako"}, {"name": "hammerhead"}, {"name": "greatwhite"}, {"name": "reef"}]
sharklist = ["mako", "hammerhead", "greatwhite", "reef"]
for typeofshark in sharklist:
typeofshark = SwimmingWithTheFishes(typeofshark)
print(f"Heavens above, that no fish: {typeofshark.name}")
typeofshark.reporting(typeofshark)
for shark in sharklist:
print(SwimmingWithTheFishes.print_return(shark))
if __name__ == "__main__":
main()
print_return
- это метод SwimmingWithTheFishes
, поэтому вы должны создать экземпляр SwimmingWithTheFishes
с shark
вместо этого, чтобы self
стал объектом SwimmingWithTheFishes
для self.name
для работы в print_return
.
Изменить:
print(SwimmingWithTheFishes.print_return(shark))
чтобы:
print(SwimmingWithTheFishes(shark).print_return())
Когда вы выполняете итерирование по списку и назначаете текущую переменную, вы не изменяете значение в списке, вы меняете только эту локальную переменную.
Например
>>> l = [1,2,3]
>>> for i in l:
... i += 1
...
>>> l
[1, 2, 3]
Чтобы изменить список, вы должны создать новый список, так как вы можете столкнуться с проблемами, если вы измените список, который вы перебираете. Этот новый список можно назвать чем-то вроде sharks
где элементы содержат экземпляры класса.
Наконец, у вас также есть недоразумение с помощью методов... Вам не нужно передавать ссылку на объект каждый раз, когда вы вызываете метод в экземпляре. Параметр self
для функции метода автоматически принимает значение экземпляра, из которого вы вызываете метод.
Это делает окончательный код:
class SwimmingWithTheFishes:
def __init__(self, typeofshark):
self.name = typeofshark
def __str__(self):
return f"I am a {self.name} shark."
def reporting(self):
print(f"This is a {self.name} shark method.")
def main():
# shark_types = [{"name": "mako"}, {"name": "hammerhead"}, {"name": "greatwhite"}, {"name": "reef"}]
shark_types = ["mako", "hammerhead", "greatwhite", "reef"]
sharks = []
for type_ in shark_types:
shark = SwimmingWithTheFishes(type_)
sharks.append(shark)
print(f"Heavens above, that no fish: {shark.name}")
shark.reporting()
for shark in sharks:
print(shark)
if __name__ == "__main__":
main()
Который дает:
Heavens above, that no fish: mako
This is a mako shark method.
Heavens above, that no fish: hammerhead
This is a hammerhead shark method.
Heavens above, that no fish: greatwhite
This is a greatwhite shark method.
Heavens above, that no fish: reef
This is a reef shark method.
I am a mako shark.
I am a hammerhead shark.
I am a greatwhite shark.
I am a reef shark.
sharklist
- это список строк, поэтомуshark
- это строка. Вы передаете эту строку вprint_return
, которая, очевидно, не может работать.