我正在尝试创建 tuple
的子类它在各方面的表现都像正常的 tuple
异常(exception)的是我使用一个字符串初始化它,该字符串首先由构造函数自动分割(我也希望它的 __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
),将其拆分并使用结果调用我的父类(super class)的构造函数。我期望得到像 tuple([ 'one', 'two', 'three' ])
这样的结果, 我。 e.单词元组:('one', 'two', 'three')
.
但是我得到了一个字符元组,i。 e.输入'one:two:three'
我得到一个('o', 'n', 'e', ':', 't', 'w', 'o', ':', 't', 'h', 'r', 'e', 'e')
这正是我调用 tuple('one:two:three')
时得到的结果.
我调试了这种情况,发现我的代码得到了正确执行(我的 __init__()
被调用,并使用正确的值调用另一个 __init__()
)。我还尝试更换 super
由混凝土 build tuple.__init__(self, text.split(':'))
,但这并没有改变任何事情。我还尝试传递 tuple
而不是 list
创建者 split()
,也没有变化。其实就是调用super的__init__()
似乎没有任何效果。解释器仍然使用我最初传递的字符串来初始化元组。
我错过了什么吗?为什么这没有按预期工作?如何创建一个类 C
它是 tuple
的子类我可以通过调用 C('one:two:three')
来初始化它获取 C
的实例这是一个类似 ('one', 'two', 'three')
的元组?
最佳答案
由于元组是不可变的,因此使用 __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))
关于python - 使用 str 为 init 子类化元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42405131/