如何在Python中初始化元组子类的实例?

Tom*_*Tom 8 python python-3.x

可能重复:
使用多个__init__参数对Python元组进行子类化

我想定义一个继承自的类tuple,我希望能够使用不支持的语法对其进行实例化tuple.举一个简单的例子,假设我想定义一个MyTuple继承自的类,tuple我可以通过传递两个值来实例化它,xy创建(my)元组(x, y).我试过以下代码:

class MyTuple(tuple):
    def __init__(self, x, y):
        print("debug message")
        super().__init__((x, y))
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试时,例如,MyTuple(2, 3)我收到了一个错误:TypeError: tuple() takes at most 1 argument (2 given).似乎我的__init__功能甚至没有被调用(基于我得到的错误以及我的"调试消息"没有打印的事实).

那么这样做的正确方法是什么?

我正在使用Python 3.2.

unu*_*tbu 12

class MyTuple(tuple):
    def __new__(cls, x, y):
        return tuple.__new__(cls, (x, y))

x = MyTuple(2,3)
print(x)
# (2, 3)
Run Code Online (Sandbox Code Playgroud)

使用的一个难点super是你不能控制接下来要调用哪个类的同名方法.因此,所有类的方法必须共享相同的调用签名 - 至少相同数量的项.由于您要更改发送到的参数数量__new__,因此无法使用super.


或者像Lattyware建议的那样,你可以定义一个命名元组,

import collections
MyTuple = collections.namedtuple('MyTuple', 'x y')

p = MyTuple(2,3)
print(p)
# MyTuple(x=2, y=3)
print(p.x)
# 2
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用`*tuple`(或`*args`)而不是`x,y`,然后它会推广到任意大小. (6认同)