Как мне создать объекты в Python при переборе элементов в списке? - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь передать элементы списка в класс, чтобы создать объект в Python.Когда я позже использую тот же список, чтобы попытаться вызвать этот объект, я получаю ошибку: у объекта 'str' нет атрибута 'name'.

Я уже некоторое время использую Python, но плохо знаком с ООП.Хотите знать, если это о сфере действия объекта>

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's no fish: {typeofshark.name}")
        typeofshark.reporting(typeofshark)

    for shark in sharklist:
        print(SwimmingWithTheFishes.print_return(shark))


if __name__ == "__main__":
    main() 

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

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

Например,

>>> 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's no fish: {shark.name}")
        shark.reporting()

    for shark in sharks:
        print(shark)


if __name__ == "__main__":
    main() 

, который дает:

Heavens above, that's no fish: mako
This is a mako shark method.
Heavens above, that's no fish: hammerhead
This is a hammerhead shark method.
Heavens above, that's no fish: greatwhite
This is a greatwhite shark method.
Heavens above, that's 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 голосов
/ 22 сентября 2018

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

Изменение:

print(SwimmingWithTheFishes.print_return(shark))

на:

print(SwimmingWithTheFishes(shark).print_return())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...