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">
如何在停止列表中返回正确的类实例名称?
答案 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>
>>>
u
和encode('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
列表的单独副本。