Печать атрибута экземпляра в списке, только если он существует - PullRequest
1 голос
/ 07 апреля 2019

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

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

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

Так что для этого кода я бы хотел, чтобы функция печати идентифицировала только элемент 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 ]

1 голос
/ 07 апреля 2019

Есть много возможных решений. Одно (хакерское) решение - использовать 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?" Если нет, переходите к следующей итерации цикла.

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

0 голосов
/ 09 апреля 2019

Я немного отредактировал код в приведенном выше вопросе, так что теперь 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()
...