#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()