0

値として整数を含むクラスに多数の属性があります。ユーザーの現在の選択に基づいて、特定の属性のすべてのデータがゼロになる場合があります。その場合、それを表示したくありません。

各属性をチェックする関数を定義しようとしています:

def NoneCheck(collegelist, attribute):
    e = []
    for college in collegelist:
        e.append(int(college.attribute))
    if sum(e) == 0:
        attribute = False
    else:
        attribute = True
    return attribute

しかし、私はエラーで終わります:

'Inventories' object has no attribute 'attribute'

明らかに「attribute」は college.attribute に渡されませんが、代わりに文字通り「attribute」属性として読み取られます。これを行う方法はありますか?

4

1 に答える 1

0

IIUC、名前から属性を取得するgetattr [docs]が必要です。例えば:

def NoneCheck(collegelist, attribute):
    return sum(getattr(coll, attribute) for coll in collegelist) != 0

与える

>>> NoneCheck([Inventory(0), Inventory(0)], 'book')
False
>>> NoneCheck([Inventory(0), Inventory(4)], 'book')
True
>>> NoneCheck([Inventory(0), Inventory(4)], 'undefined')
Traceback (most recent call last):
  File "<ipython-input-5-4aae80aba985>", line 1, in <module>
    NoneCheck([Inventory(0), Inventory(4)], 'undefined')
  File "<ipython-input-1-424558a8260f>", line 2, in NoneCheck
    return sum(getattr(coll, attribute) for coll in collegelist) == 0
  File "<ipython-input-1-424558a8260f>", line 2, in <genexpr>
    return sum(getattr(coll, attribute) for coll in collegelist) == 0
AttributeError: 'Inventory' object has no attribute 'undefined'

ただし、私は自分自身をめったに使用getattrしないと言わなければなりませんsetattr。一度に多くの属性に何かを適用する必要があるときはいつでも、それらの名前をどこかに配置して、それらをループできるようにする必要があることに気付きます..そうする場合は、dict最初に a を使用することもできます!

于 2013-03-30T04:20:16.043 に答える