Печать атрибута экземпляра в списке, только если он существует
Я хочу напечатать атрибут класса, часть списка экземпляров, только если этот атрибут существует
я создал имя класса Guitarist, которое включает атрибут name и другие элементы (обычно это словарь, в который пользователь может добавить дополнительные данные, такие как группа, гитара и т. д.). Он добавляет класс в список (надеюсь, я не путаю термины), я создал другой класс под названием FenderGuitarist, который наследует Guitarist, и добавляет атрибут гитару в конструктор. Как мне изменить функцию печати, которая получает список гитаристов в качестве параметра, что только если он идентифицирует атрибут гитары, он печатает его? примечание: пожалуйста, не обращайте внимания на тот факт, что пользователь может добавить гитарный атрибут и к другому словарю.
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 как имеющий атрибут гитары, а затем напечатала его. для остальных просто напечатайте имя и все, что есть в другом элементе:
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)
2 ответа
Есть много возможных решений. Одно (хакерское) решение - использовать 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
?"Если нет, переходите к следующей итерации цикла.
Я рад поделиться с вами другими решениями, если это не поможет.
Я немного отредактировал код в вопросе выше, так что теперь Fender является частью конструктора, а не входным.
hasattr решит проблему. На самом деле я просто хотел добавить функцию print_list, чтобы она печатала атрибут гитары, если он существует, и в любом случае печатала все остальные. поэтому добавление:
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()