@mkone112
Начинающий питонист.

Как реализовать перегрузку методов в python?

Как в питоне 3.6 реализовать подобное поведение?
from datetime import date

class Datepicker:
    def __init__(self, date: date) -> None:
        print('date object')
    def __init__(self, year, month, day) -> None:
        print('args')


Datepicker(date.today())  # date object
Datepicker(2020, 1, 1)  # args
help(Datepicker.__init__)
Help on wrapper_descriptor:

__init__(self, date: date) -> None
__init__(self, year, month, day) -> None
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
@mkone112 Автор вопроса
Начинающий питонист.
from functools import singledispatch


class Test:
    def __init__(self):
        self.render = singledispatch(self.render)
        self.render.register(str, self._render_str)
        self.render.register(int, self._render_int)

    def render(self, s):
        raise TypeError(f"{type(s)} type isn't supported:")

    def _render_str(self, s, b=None):
        print("render str")

    def _render_int(self, s):
        print("render int")

t = Test()
>> t.render('s')
render str
>> t.render(1)
render int

p.s. конечно это можно реализовать с помощью метакласса - но как по мне это перебор
https://github.com/dabeaz/python-cookbook/blob/mas...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
В python нет перегрузки методов, вместо этого там можно принимать произвольные параметеры через *args и **kwargs, например:

def __init__(self, *args):
    if isinstance(args[0], date):
        # это date
    elif all(isinstance(arg, int) for arg in args[0:3]):
        # это 3 int
Ответ написан
hottabxp
@hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы