2
class ligne():
    def __init__ (self, stops):
        ##stops = a list of instances of Ligne1Stop class
        self.stops = stops
    def returnAllStopsOnLigne(self):
        return self.stops

メソッドreturnAllStopsOnLigne()を呼び出すと、次のリストが表示されます。

"<__main__.ligne1Stop instance at 0x1418828">

ストップリストで適切なクラスインスタンス名を返すにはどうすればよいですか?

4

4 に答える 4

9

あなたはrepr()あなたのクラスの表現出力を見ています。カスタムクラスで定義されている場合、フックrepr()を呼び出します。__repr__()

def __repr__(self):
    return '<linge1Stop: name={0}>'.format(self.name)
于 2012-12-17T14:51:30.000 に答える
2

Martijnの答えの代わりに、次のことができます

return [ s.__class__.__name__ for s in self.stops ]

もちろん、クラスインスタンス名のみに関心がある場合

于 2012-12-17T15:11:07.197 に答える
2

インスタンスごとに文字列表現を返す正しい方法は__repr__、次のようにクラスにメソッドを定義することです。

class ligne(object):
    def __repr__(self):
        return u'<{c} name={n}>'.format(c=self.__class__.__name__, n=self.name).encode('utf-8')

使用例:

>>> L = ligne()
>>> L.name = u'John Smith'
>>> L
<ligne name=John Smith>
>>>

uおよびの目的は、属性がUnicode値(たとえば)に設定されているときに、が壊れないencode('utf-8')ようにすることです。これはよくある初心者の間違いであり、通常は本番環境でしか見られず、頭痛の種になる可能性があります。使用例:__repr__nameCafé Del Mar

>>> type(u'Hello, World'.encode('utf-8'))
<type 'str'>

サブクラス化したことにも注意してくださいobject。サブクラス化しないと、希望または予想とはobject異なるMROが発生します。これは、Python3との上位互換性がありません。

于 2012-12-17T19:07:04.640 に答える
1

提供する出力に基づいて、Ligne1Stopクラスの単一のインスタンスを渡します。明らかに、これはそのようなインスタンスのすべての「名前」を与えるわけではありません。

あなたがすべきことは、そのクラス自体のクラスのすべてのインスタンスのリストを保持することです。

class Ligne1Stop(object):
      allinstances = []

      def __init__(self, name, *args):
          self.allinstances.append(self)
          self.name = unicode(name)
          # rest of init

すべての名前を取得するには、名前を取得する方法を追加し、__unicode__それを文字列表現として使用するメソッドを定義する必要があります。

      def __unicode__(self):
          return self.name

次に、次のことができます。

[str(instance) for instance in Ligne1Stop.allinstances]

必要に応じて、リストの別のコピーを返すメソッドを追加しallinstancesたり、プロパティの背後にリストを非表示にしたりできます。

于 2012-12-17T15:11:58.657 に答える