用str为ini子类化Tuple

2024-04-20 16:11:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个tuple的子类,它在各个方面的行为都像一个普通的tuple一样,只是我用一个字符串初始化它,这个字符串首先被构造函数自动拆分(我也希望它的__str__()再次加入这个类,但这不是这里的问题)。你知道吗

我以为这是直截了当的,就这样试着:

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')

因此,我尝试传递一个text(a str),拆分它并用结果调用我的超类的构造函数。我希望得到一个类似于tuple([ 'one', 'two', 'three' ])的结果,即一个单词元组:('one', 'two', 'three')。你知道吗

但是我得到了一个字符元组,也就是说,对于输入'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')的元组?你知道吗


Tags: 字符串textselfinitdef子类oneclass
1条回答
网友
1楼 · 发布于 2024-04-20 16:11:01

由于元组是不可变的,请使用__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))

相关问题 更多 >