1

我想打印一个类属性,实例列表的一部分,只有当这个属性存在时

我创建了一个类名 Guitarist,其中包括一个名称属性和 otherItems(通常是一个字典,供用户添加其他数据,如乐队、吉他等......)。它将类添加到列表中(我希望我不会混淆术语)我创建了另一个名为 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"

打印结果:列表中每个项目的名称、吉他(如果存在)和字典的其他项目

因此,对于此代码,我希望打印功能仅将 tomMisch 项目标识为具有吉他属性,然后打印它。对于其他人,只需打印名称和 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)
4

2 回答 2

1

有很多可能的解决方案。一种(hacky)解决方案是使用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?” 如果不是,则继续循环的下一次迭代。

如果这个不能解决,我很乐意分享更多解决方案。

于 2019-04-07T13:59:20.800 回答
0

我已经编辑了上面问题中的代码,所以现在 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()
于 2019-04-09T07:35:52.627 回答