Есть ли функция для печати строки объекта в объекте? - PullRequest
0 голосов
/ 14 января 2019

Итак, я делаю ООП, и у меня есть зоопарк. Мой зоопарк - это класс, в котором содержатся зоопарки и животные. Животные имеют атрибуты «имя, корм, кормушка» (str, bool, obj). На моем терминале Zoo зоопарк может использовать мою программу. Он может: Накормить животное, проверить, кормят ли одно животное, а также может перечислить всех животных. Здесь моя проблема возникает. (Обратите внимание, что все мои животные сейчас находятся в одном классе и называются «Ларс Ледяной медведь» или «Немо клоунфиш»

Когда я проверяю одно животное, я ввожу имя животного и вызываю мой метод select_animal. Это возвращает экземпляр этого животного, если оно найдено, или 'none', если оно не найдено. elif 'c', потому что a и b - корма для животных и список всех животных. check_animal проверяет, был ли он подан.

elif(chosen_program == "c"):
    selected_animal = select_animal()
    checked_animal = first_zoo.check_aniaml(selected_animal)
    if(checked_animal == True):
        print(str(selected_animal.name) + " has been fed by " + str(selected_animal.keeper.name))
    else:
        print(selected_animal.name + " hasn't been fed yet!")

Это отлично работает. Он хорошо печатает: «Симба, льва еще не кормили» или «Симба, льва, которого кормил Майк»

Когда я печатаю список, хотя:

elif(chosen_program == "b"):
    print("\nKeepers:")
    for Keeper in first_zoo.keeper_list:
        print(Keeper.name + ", ", end='')
        print(Keeper.fed_animals)                   # fed animals is a list
    print("\nAnimals:")                               
    for Animal in first_zoo.animal_list:            #
        print(Animal.name + ", ", end='')           #
        print(str(Animal.fed) + ", ", end='')       #bool
        print(Animal.feeder)                        #pointer to the feeder, not a str!

Это тоже работает, но не так, как я хочу. если я поставлю print (Animal.feeder), то будет напечатано «Ларс Ледяной Медведь, Правда»

Я просто хочу напечатать имя, поэтому я попытался сделать то же, что и в c), с помощью print (Animal.feeder.name)

Exception has occurred: AttributeError
'str' object has no attribute 'name'
  File "C:\Users\x\Google Drive\Files\Programs\python\Library\main.py", line 122, in <module>
    print(Animal.feeder.name)

Подведем итог: это мой вопрос. Как мне напечатать имя хранителя. Есть ли в python хорошая функция, где я мог бы сделать xprint (animal_list), и она выдала бы мне ("Lars the Icebear", True, "Mike"; "Nemo the clownfisch", False, none) и т. Д.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Для управления тем, что печатается для класса, вы можете реализовать магический метод __str__, чтобы делать все, что вам угодно. Это: "Вызывается встроенной функцией str () и оператором print для вычисления" неформального "строкового представления объекта."

Добавьте метод, который возвращает нужную строку внутри вашего класса, например:

def __str__(self):
  return "Hi"

(Вы хотите покопаться в своем объекте, чтобы найти фактическую строку, которую хотите вернуть)

0 голосов
/ 14 января 2019

Первая вещь Animal.feeder имеет тип string, т.е. str, поэтому вы не можете получить доступ к атрибуту 'name', которого нет вообще.

вторая вещь Я не знаю, что типа 'animal_list'

предположим, что если это объект класса zoo , то вы должны написать метод __str__(self) в этом классе

class zoo:
    def __init__(self):
        pass
    def __str__(self):
       '''create str here and return'''
       temp = ""
       for Animal in first_zoo.animal_list:            #
           temp += Animal.name + " "str(Animal.fed)+" "+Animal.feeder+"\n"
       return temp

, если animal_list - список, вы можете напечатать его по print(animal_list)

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