Типы в модуле typing
на самом деле не предназначены для непосредственного создания экземпляров: они должны использоваться как статические подсказки типов в аннотациях.
Но если вам действительно нужно, вы можете переопределить __new__()
, чтобы вернуть кортеж:
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().__new__()
не будет работать, потому что typing.Tuple
(и другие универсальные типы) отбрасывают передаваемые им аргументы. Вы должны «замкнуть накоротко», позвонив tuple.__new__()
напрямую.