import typing as tp
class Test:
@tp.overload
def __init__(self, x: int, y: str):
... # тут не должно быть тела!
@tp.overload
def __init__(self, other: 'Test'):
... # typehint в виде строки, так как класс Test еще не создан. Тела нет!
def __init__(self, *args, **kwargs): # настоящий конструктор
# определяем, как нас вызвали
if 'other' in kwargs:
first_arg = kwargs['other']
x, y = first_arg.x, first_arg.y
elif 'x' in kwargs:
x, y = kwargs.get('x'), kwargs.get('y')
elif isinstance(args[0], Test):
x, y = args[0].x, args[0].y
else:
x, y = args[0:2]
self.x: int = x
self.y: str = y
def __repr__(self) -> str:
return f'Test(x={self.x!r}, y={self.y!r})'
# порядковая передача аргументов сработает
t1 = Test(1, 'foo')
t2 = Test(t1)
print(t1, t2)
# именованная передача аргументов сработает
t3 = Test(x=2, y='bar')
t4 = Test(other=t3)
print(t3, t4)
Test(3, y='baz') # а вот это сломается...