【问题标题】:Subclassing Tuple with str for init [duplicate]使用 str 为 init 子类化元组 [重复]
【发布时间】:2017-07-13 07:22:56
【问题描述】:

我正在尝试创建tuple 的子类,它在所有方面的行为都像普通的tuple,除了我用构造函数首先自动拆分的字符串初始化它(我也想要它的@ 987654323@ 再次加入,但这不是这里的问题)。

我认为这是直截了当的,并像这样尝试:

class C(tuple):
  def __init__(self, text):
    super(C, self).__init__(text.split(':'))

  def __str__(self):
    return '[%s]' % ':'.join(self)

c = C('one:two:three')  # I expect this to be like ('one', 'two', 'three')

所以我尝试传递textstr),将其拆分并使用结果调用我的超类的构造函数。我希望得到类似tuple([ 'one', 'two', 'three' ]) 的结果,即。 e.单词元组:('one', 'two', 'three').

但是我得到了一个字符元组,即。 e.对于输入 'one:two:three',我得到一个 ('o', 'n', 'e', ':', 't', 'w', 'o', ':', 't', 'h', 'r', 'e', 'e'),这正是我调用 tuple('one:two:three') 时得到的结果。

我调试了这种情况,发现我的代码得到了正确执行(我的__init__() 被调用并使用正确的值调用另一个__init__())。我还尝试用具体的tuple.__init__(self, text.split(':')) 替换super 构造,但这并没有改变任何东西。我还尝试传递tuple 而不是split() 创建的list,也没有变化。其实调用super的__init__()好像也没什么效果。解释器仍然用我最初传递的字符串初始化元组。

我错过了什么吗?为什么这没有按预期工作?如何创建一个类C,它是tuple 的子类,我可以通过调用C('one:two:three') 来初始化它以获取C 的实例,它是一个类似于('one', 'two', 'three') 的元组?

【问题讨论】:

  • 您使用的是哪个版本?我在 3.5 收到 TypeError: object.__init__() takes no parameters
  • @StevenSummers:我在这个项目中使用的是 Python 2.7,但我很好奇:当你在 3.5 中继承 tuple 时,你真的收到关于 object.__init__() 不带参数的错误消息吗?
  • 这是我在运行您的代码时收到的,3.4 和 3.6 相同

标签: python inheritance constructor tuples subclass


【解决方案1】:

由于元组是不可变的,请使用 __new__ 而不是 __init__

class C(tuple):
    def __new__(cls, text):
        return super(C, cls).__new__(cls, text.split(':'))

    def __str__(self):
        return '[%s]' % ':'.join(self)

c = C('one:two:three')
print(c)
print(list(c))

【讨论】:

猜你喜欢
  • 2022-01-14
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多