如何在Python中正确返回类实例列表

时间:2012-12-17 14:48:45

标签: python list class

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 个答案:

答案 0 :(得分:9)

您正在查看类的repr()表示输出。 repr()如果在自定义类上定义,则会调用__repr__() hook

def __repr__(self):
    return '<linge1Stop: name={0}>'.format(self.name)

答案 1 :(得分:2)

除了Martijn的答案,你可以

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

当然,如果您对类实例名称中的感兴趣

答案 2 :(得分: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>
>>>

uencode('utf-8')的目的是确保当__repr__属性设置为Unicode值时,name不会中断(例如, Café Del Mar)。这是一个常见的noob错误,通常不会被捕获,直到生产,它可能会成为一个头痛。用法示例:

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

另请注意,我已将object子类化。不继承object将导致与您想要或期望的不同MRO,并且这与Python 3不向前兼容。

答案 3 :(得分:1)

根据您提供的输出,您将传递Ligne1Stop类的单个实例。显然,这不会给你所有的名字&#34;这种情况。

您应该做的是保留该类中所有类的实例列表:

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列表的单独副本。