Печать атрибута экземпляра в списке, только если он существует

#python #python-3.x #class #object-oriented-database #inherited-constructors

#python #python-3.x #класс #объектно-ориентированная база данных #унаследованные конструкторы

Вопрос:

Я хочу напечатать атрибут класса, часть списка экземпляров, только если этот атрибут существует

я создал класс с именем Guitarist, который включает атрибут name и otherItems (который обычно представляет собой словарь для пользователя, позволяющий добавлять дополнительные данные, такие как группа, гитара и т.д.). Это добавляет класс the в список (надеюсь, я не путаю термины) я создал другой класс под названием FenderGuitarist, который наследует Guitarist и добавляет атрибут guitar в конструктор. Как мне изменить функцию print, которая получает список гитаристов в качестве параметра, чтобы она печатала его, только если она идентифицирует атрибут guitar? примечание: пожалуйста, игнорируйте тот факт, что пользователь также может добавить атрибут guitar в раздел otherItems.

 guitarists = []

class Guitarist:
    playing_instrument = "guitar"

    def __init__(self, name, otherItems=None):
        self.name = name
        self.otherItems = otherItems
        guitarists.append(self)

    def __str__(self):
        return "Guitarist"

    def get_playing_instrument(self):
        return self.playing_instrument

def print_list(list):
    for item in list:
        print(f"name {item.name}",  end="")
        if item.otherItems is not None:
            print(":")
            for key,value in item.otherItems.items():
                print(key, value)
            print()

class FenderGuitarist(Guitarist):
    def __init__(self, name, otherItems=None):
        Guitarist.__init__(self, name, otherItems=None)
        self.guitar = "Fender"

    def __str__(self):
        return "Fender Guitarist"
  

результат печати: имя, гитара (если существует) и другие элементы справочника для каждого элемента в списке

Итак, для этого кода я бы хотел, чтобы функция печати идентифицировала только элемент tomMisch как имеющий атрибут guitar, а затем распечатала его. для остальных просто выведите name и все, что указано в разделе otherItems:

 from classes import *


johnMayer = Guitarist("John Mayer", {"favorite guitar": "Fender/PRS"})
dictJimmy = {"band": "Led Zeppelin", "favorite guitar": "Gibson"}
jimmyPage = Guitarist("Jimmy Page", dictJimmy)
tomMisch = FenderGuitarist("Tom Misch")

print_list(guitarists)
  

Комментарии:

1. Класс не добавлен в список, хотя экземпляры класса добавлены.

2. правильно. Я изменил заголовок, если это то, что вы имели в виду

Ответ №1:

Существует множество возможных решений. Одним (хакерским) решением является использование hasattr :

 def print_list(list):
    for item in list:
        if not hasattr(item, 'guitar'):
            continue

        print(f"name {item.name}",  end="")
        if item.otherItems is not None:
            print(":")
            for key,value in item.otherItems.items():
                print(key, value)
            print()
  

Что мы здесь делаем, так это спрашиваем: «у этого item есть атрибут, который называется guitar ?» Если нет, переходите к следующей итерации цикла.

Я рад поделиться другими решениями, если это не подходит.

Комментарии:

1. hasattr могло бы быть лучше.

2. Да, hasttr определенно лучше. Должен ли я редактировать опубликованное решение? Я не уверен, каков стандартный этикет для подобных ситуаций.

3. Вы всегда можете изменить свой ответ. Если комментарий указывает на улучшение или недостаток, вы можете изменить его. Иногда, если в комментарии предлагается альтернативный вариант, который мне нравится, но ответ уже принят, я добавлю альтернативный вариант и оставлю оригинал.

Ответ №2:

я немного отредактировал код в вопросе выше, так что теперь Fender является частью конструктора, но не в качестве входных данных.

hasattr решает проблему. на самом деле я просто хотел добавить функцию print_list, чтобы она печатала атрибут guitar, если он существует, и в любом случае печатала все остальные. таким образом, добавление:

 if hasattr(item, 'guitar'):
    print(", guitar Fender")
  

итак, вся функция теперь выглядит следующим образом:

 def print_list(list):
for item in list:
    print(f"name {item.name}",  end="")
    if hasattr(item, 'guitar'):
        print(", guitar Fender")
    if item.otherItems is not None:
        print(":")
        for key,value in item.otherItems.items():
            print(key, value)
        print()