Как вы заметили в своем вопросе, вызывается конструктор varargs.Это связано с тем, что второе определение Dice.__init__
переопределяет, а не перегружает первое.
Python не поддерживает перегрузку методов , поэтому у вас есть как минимум два варианта под рукой.
- Определить только конструктор varargs.Проверьте длину списка аргументов и типы первых нескольких элементов, чтобы определить, какую логику запустить.По сути, вы должны объединить два конструктора в один.
- Преобразовать один из конструкторов в метод статической фабрики.Например, вы можете удалить первый конструктор, оставить varargs и затем определить новый фабричный метод.
Я предпочитаю второй метод, который позволяет вам четко отделить вашу логику.Вы также можете выбрать более описательное имя для вашего фабричного метода;from_n_sided_dice
более информативен, чем просто Dice
:
@staticmethod
def from_n_sided_dice(num_dice, sides):
return Dice([Die(sides)] * num_dice)
Примечание: действительно ли это то, что вы хотите?[Die(sides)] * num_dice
возвращает список с несколькими ссылками на один и тот же объект Die.Скорее вы можете захотеть [Die(sides) for _ in range(num_dice)]
.
РЕДАКТИРОВАТЬ: Вы можете эмулировать перегрузку метода (через динамическую диспетчеризацию, а не статическую диспетчеризацию, как вы привыкли, ностатические типы не существуют в Python) с декораторами функций.Возможно, вам придется разработать собственное решение для поддержки *args
и **kwargs
, и использование отдельных методов с более точными именами все еще часто является лучшим решением.