Python 3.x 从“typing.tuple”派生时,如何初始化基“tuple”?

Python 3.x 从“typing.tuple”派生时,如何初始化基“tuple”?,python-3.x,type-hinting,Python 3.x,Type Hinting,根据“内置泛型类型..作为类型和基类都有效。”它给出了一个派生自Dict[str,List[Node]]的示例 但是,当我尝试使用Tuple[int,int]时,构造函数没有正确地转发。例如: from typing import Tuple class MyTuple(Tuple[int, int]): def hello(self): print("hello: " + str(len(self))) MyTuple([1, 2]).hello() 打印你好:0

根据“内置泛型类型..作为类型和基类都有效。”它给出了一个派生自
Dict[str,List[Node]]
的示例

但是,当我尝试使用
Tuple[int,int]
时,构造函数没有正确地转发。例如:

from typing import Tuple

class MyTuple(Tuple[int, int]):
    def hello(self):
        print("hello: " + str(len(self)))

MyTuple([1, 2]).hello()
打印
你好:0
。如果我从内置的
元组派生,它将打印
hello:2


当从
tuple[int,int]
派生时,如何初始化基本
tuple
对象?

键入
模块中的类型实际上并不意味着直接实例化:它们应该在注释中用作静态类型提示

但如果确实需要,可以重写
\uuuuu new\uuuu()
以返回元组:

class MyTuple(Tuple[int, int]):

    def __new__(cls, *args, **kwargs):
        return tuple(*args, **kwargs)

print(MyTuple('abc'))  # -> ('a', 'b', 'c')
这将在每次调用
MyTuple()
时创建普通元组对象。如果希望对象成为类的实例:

class MyTuple(Tuple[int, int]):

    def __new__(cls, *args, **kwargs):
        return tuple.__new__(cls, *args, **kwargs)

print(MyTuple('abc'))  # -> ('a', 'b', 'c')
print(type(MyTuple('abc')))  # -> __main__.MyTuple
这是因为
typing.Tuple
Tuple
的子类


请注意,调用
super()。\uuuu new\uuuu()
将不起作用,因为
typing.Tuple
(和其他泛型类型)会丢弃传递给它们的参数。您必须通过直接调用
tuple来“短路”。\uuu new\uuu()

谢谢。当然,指定泛型基类的类型是一个关键问题,但是我链接和引用的文档非常清楚地表明,从内置泛型类型派生是应该做的。如果我直接从tuple派生,mypy会抱怨我的tuple的元素属于Any类型。谢谢你建议我使用
\uuuuu new\uuuuuu
,我没有想到这一点。然而,在我的用例中,我添加了方法和其他字段;如果我让
\uuuuu new\uuuuu
返回一个元组,而不是我的类的一个实例,那么这就不起作用了。还有其他建议吗?