【问题标题】:Emulating a list in Python在 Python 中模拟列表
【发布时间】:2012-09-21 20:20:35
【问题描述】:

我正在使用一个模拟 python 列表的类。当我在没有索引的情况下访问它时,我想将它作为 python list() 返回。

使用普通列表():

>>> a = [1,2,3] >>> 一个 [1,2,3]

我得到的,基本上是:

>>> a = MyList([1,2,3]) >>> 一个

我不知道哪种 dunder 方法(如果有)可以让我自定义此行为?

我认为会是 __ 得到 __ ?虽然 list() 没有实现 get/set/delete - 我猜是因为它是内置的?

【问题讨论】:

  • 我发布了一个答案,但实际上我不确定你的意思。你能举例说明你想要达到的目标吗?如果您想在控制台中键入a 时显示您的列表,那么您正在寻找__repr__ 方法
  • 当您只输入名称时,您在交互式 shell 中看到的是 repr (REPResentational) 字符串。与第一个相同,其中一个真正的列表发出一个看起来像源代码的字符串。理想情况下,eval(repr(object)) 应该适用于简单类型。因此,当您这样显示它时,您不是在“访问”它,而是“串化”它。
  • 是的,这正是我想要的。我对那里真正发生的事情感到困惑。
  • @VincentSavard 实际上您发布的答案是正确的。

标签: python list types


【解决方案1】:

您正在寻找的方法是__repr__。 另见http://docs.python.org/reference/datamodel.html#object.repr

【讨论】:

    【解决方案2】:

    您应该在您的类中重写 __repr__ 方法(以及可选的 __str__ 方法),请参阅此 post 以了解有关差异的讨论。

    类似这样的:

    class MyList(object):
        def __repr__(self):
            # iterate over elements and add each one to resulting string
    

    正如 cmets 中所指出的,如果未定义 __str__str() 将调用 __repr__,但如果未定义 __repr__,则 repr() 不会调用 __str__

    【讨论】:

    • 如果你只打算实现一个,实现__repr__而不是__str__。如果__str__ 未定义,str 会调用__repr__,但如果__repr__ 未定义,repr 不会调用__str__
    【解决方案3】:

    一个非常简单的例子:

    class MyList(object):
        def __init__(self,arg):
           self.mylist = arg
        def __repr__(self):
            return 'MyList(' + str(self.mylist) + ')'
        def __str__(self):
            return str(self.mylist)
        def __getitem__(self,i):
            return self.mylist[i]
    
    a = MyList([1,2,3])
    print a
    print repr(a)
    for x in a:
        print x
    

    输出:

    [1, 2, 3]
    MyList([1, 2, 3])
    1
    2
    3
    

    【讨论】:

      【解决方案4】:

      请允许我回答我自己的问题 - 我相信这是我正在寻找的 __ repr __ 方法。如果我错了,请纠正我。这是我想出的:

      def __repr__(self):
          return str([i for i in iter(self)])
      

      【讨论】:

      • 我想return repr(self.lis) 就足够了。
      猜你喜欢
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      相关资源
      最近更新 更多