67

だから私はと呼ばれるクラスを持っていVertexます。

class Vertex:
    '''
    This class is the vertex class. It represents a vertex.
    '''

    def __init__(self, label):
        self.label = label
        self.neighbours = []

    def __str__(self):
        return("Vertex "+str(self.label)+":"+str(self.neighbours))

次のように、このクラスのオブジェクトのリストを出力したいと思います。

x = [Vertex(1), Vertex(2)]
print x

しかし、次のような出力が表示されます。

[<__main__.Vertex instance at 0xb76ed84c>, <__main__.Vertex instance at 0xb76ed86c>]

Vertex.label実際には、各オブジェクトの値を出力したかったのです。それを行う方法はありますか?

4

3 に答える 3

94

各オブジェクトのラベルを出力したいだけなら、ループまたはリスト内包表記を使用できます。

print [vertex.label for vertex in x]

__repr__しかし、元の質問に答えるには、リスト出力を正しくするメソッドを定義する必要があります。次のような単純なものである可能性があります。

def __repr__(self):
    return str(self)
于 2012-10-17T12:10:17.763 に答える
17

ダニエル・ローズマンに加えてもう少し情報が必要な場合は、次のように答えてください。

__repr__Pythonでは__str__2つの異なるものです。(ただし、を定義した場合は、__repr__class.__str__の呼び出しはへの呼び出しに変換されることに注意してくださいclass.__repr__

の目標__repr__は、明確にすることです。さらに、可能な限り、reprを定義して(あなたの場合)eval(repr(instance)) == instance

一方、の目標は__str__償還可能であることです。したがって、インスタンスを画面に印刷する必要があるかどうか(おそらくユーザーにとって)、それを行う必要がない場合は実装しないでください(また、実装されていないstrがreprと呼ばれる場合)

さらに、Idleインタープリターに入力すると、オブジェクトのrepr表現が自動的に呼び出されます。または、リストを印刷すると、リストに含まれる要素のrepr表現を順番に呼び出すlist.__str__(と同じ)呼び出しが行われます。list.__repr__これはあなたが得る振る舞いとうまくいけばそれを修正する方法を説明します

于 2012-10-17T12:28:25.973 に答える