【问题标题】:How to correctly return a list of class instances in Python如何在 Python 中正确返回类实例列表
【发布时间】:2012-12-04 16:17:09
【问题描述】:
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">

如何在停止列表中返回正确的类实例名称?

【问题讨论】:

  • 您需要所有实例吗?描述/问题比较纠结……

标签: python list class


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    除了 Martijn 的回答,您可以

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

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

    【讨论】:

      【解决方案3】:

      根据您提供的输出,您将传入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 列表的单独副本和/或将其隐藏在属性后面。

      【讨论】:

      • 优秀的答案,非常感谢。我实际上创建了每个实例的列表,并列出了我提供的输出(不仅仅是一个)。不过你的回答还是比较有效的。
      【解决方案4】:

      为每个实例返回字符串表示的正确方法是在类上定义__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') 的目的是确保当 name 属性设置为 Unicode 值(例如,Café Del Mar)时,__repr__ 不会中断。这是一个常见的菜鸟错误,通常在生产之前不会被发现,这可能会让人头疼。示例用法:

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

      还要注意,我将object 子类化了。不继承 object 将导致 MRO 与您想要或预期的不同,这与 Python 3 不向前兼容。

      【讨论】:

      • @MartijnPieters - UNICODE_OBJECT.encode('utf-8') IS str...argumentum ad infinitum 多少?
      • @MartijnPieters - 哈,看... 无限的争论
      • 好的,重新阅读编辑,我在行尾错过了您的.decode('utf8');所以对此我深表歉意。不过,我仍然会恢复该编辑;在这种情况下,额外的评论不会受到伤害。出于某种原因,我的示例尽可能简单,接下来必须教授 unicode 与 string 的内容超出了范围。我希望你的回复能更清楚一点,你会早点收到我的道歉。
      猜你喜欢
      • 2011-02-24
      • 2012-02-21
      • 1970-01-01
      • 2016-10-11
      • 2018-05-02
      • 1970-01-01
      • 2022-10-04
      • 2016-03-20
      • 2019-04-10
      相关资源
      最近更新 更多