Multiple __init__ definitions

with the overload decorator it is now possible to have dedicated __init__ functions

import logging
import time

from strongtyping_pyoverload import overload


class Example:
    @overload
    def __init__(self):
        self.a = int(time.time())
        self.b = self.a * 10
        self.c = None

    @overload
    def __init__(self, a: int):
        self.a = a
        self.b = self.a * 10
        self.c = None

    @overload
    def __init__(self, a: int, b: int):
        self.a = a
        self.b = b
        self.c = None

    @overload
    def __init__(self, a: int, b: int, c: logging.Logger):
        self.a = a
        self.b = b
        self.c = c

Default case

>>> example = Example()
>>> example.a
1644660239
>>> example.b
16446602390
>>> example.c
None

Partial parameter definition

>>> example = Example(20)
>>> example.a
20
>>> example.b
200
>>> example.c
None
>>> example = Example(21, 42)
>>> example.a
21
>>> example.b
42
>>> example.c
None

Define each parameter

>>> example = Example(42, 84, logging.getLogger(__name__))
>>> example.a
42
>>> example.b
84
>>> example.c
<Logger __main__ (WARNING)>

Not supported types

>>> example = Example("42", 84, logging.getLogger(__name__))
AttributeError: `Example` has no function which matches with your parameters `('42', 84, <Logger __main__ (WARNING)>)`