Как мне создать объекты в Python при переборе элементов в списке?

1

Я пытаюсь передать элементы в список класса для создания объекта в 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() 
  • 0
    sharklist - это список строк, поэтому shark - это строка. Вы передаете эту строку в print_return , которая, очевидно, не может работать.
Теги:
object
list
oop

2 ответа

0
Лучший ответ

print_return - это метод SwimmingWithTheFishes, поэтому вы должны создать экземпляр SwimmingWithTheFishes с shark вместо этого, чтобы self стал объектом SwimmingWithTheFishes для self.name для работы в print_return.

Изменить:

print(SwimmingWithTheFishes.print_return(shark))

чтобы:

print(SwimmingWithTheFishes(shark).print_return())
1

Когда вы выполняете итерирование по списку и назначаете текущую переменную, вы не изменяете значение в списке, вы меняете только эту локальную переменную.

Например

>>> 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.
  • 0
    Большое спасибо, это имеет смысл. Оценил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню