Python 打印列表中实例的属性(仅当其存在时)

Python 打印列表中实例的属性(仅当其存在时),python,python-3.x,class,object-oriented-database,inherited-constructors,Python,Python 3.x,Class,Object Oriented Database,Inherited Constructors,我想打印一个类属性,它是实例列表的一部分,仅当该属性存在时才打印 我创建了一个类名Guitarist,它包括一个name属性和其他项(通常是一个字典,供用户添加额外的数据,如band、guitar等)。它将类添加到列表中(我希望我没有混淆术语) 我创建了另一个名为FenderGuitarst的类,它继承了Guitarst,并向构造函数添加了一个吉他属性。 如何更改print函数(它将吉他手列表作为一个参数),即仅当它标识一个吉他属性时,才会打印它? 注意:请忽略一个事实,即用户也可以将吉他属性添

我想打印一个类属性,它是实例列表的一部分,仅当该属性存在时才打印

我创建了一个类名Guitarist,它包括一个name属性和其他项(通常是一个字典,供用户添加额外的数据,如band、guitar等)。它将类添加到列表中(我希望我没有混淆术语) 我创建了另一个名为FenderGuitarst的类,它继承了Guitarst,并向构造函数添加了一个吉他属性。 如何更改print函数(它将吉他手列表作为一个参数),即仅当它标识一个吉他属性时,才会打印它? 注意:请忽略一个事实,即用户也可以将吉他属性添加到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"
打印结果:列表中每个项目的名称、吉他(如果存在)和词典的其他项目

因此,对于这段代码,我希望print函数只将tommish项标识为具有吉他属性,然后将其打印出来。对于其他人,只需在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)

有很多可能的解决方案。一个(黑客)解决方案是使用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()
我们在这里要做的是询问“此
是否具有名为
吉他
的属性?”如果没有,则继续循环的下一次迭代


如果这个解决方案不能解决问题,我很乐意与大家分享更多的解决方案。

我对上面问题中的代码进行了一些编辑,因此现在挡泥板是构造函数的一部分,但不是作为输入

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

可能更好。是的,
hasttr
肯定更好。我应该编辑发布的解决方案吗?我不确定这种情况下的标准礼仪是什么。你可以随时改变你的答案。如果评论指出改进或不足之处,您可以自由更改。有时,如果一条评论建议了一个我喜欢的备选方案,但答案已经被接受,我会添加该备选方案并保留原始方案。虽然该类没有添加到列表中,但该类的实例是。对的。如果这是你的意思,我已经更改了标题