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和的目的encode('utf-8')是确保当您的属性设置为 Unicode 值(例如,)__repr__时不会中断。这是一个常见的菜鸟错误,通常在生产之前不会被发现,这可能会让人头疼。示例用法:nameCafé Del Mar

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

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

于 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 回答