Я пытаюсь реализовать перегрузку метода в Python:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow(2)
но выход есть second method 2
; так же:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow()
дает
Traceback (most recent call last):
File "my.py", line 9, in <module>
ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)
Как мне сделать эту работу?
python
class
overloading
user1335578
источник
источник
Ответы:
Это перегрузка метода, а не переопределение метода . А в Python вы делаете все это в одной функции:
Вы не можете иметь два метода с одинаковым именем в Python - и вам это не нужно.
Смотрите раздел Значения аргумента по умолчанию в руководстве по Python. См. «Наименьшее изумление» и изменяемый аргумент по умолчанию, чтобы избежать распространенной ошибки.
Редактировать : См. PEP 443 для получения информации о новых универсальных функциях единой диспетчеризации в Python 3.4.
источник
Вы также можете использовать pythonlangutil :
источник
В Python вы так не делаете. Когда люди делают это на таких языках, как Java, они обычно хотят получить значение по умолчанию (если они этого не делают, они обычно хотят метод с другим именем). Таким образом, в Python вы можете иметь значения по умолчанию .
Как видите, вы можете использовать это для запуска отдельного поведения, а не просто для использования значения по умолчанию.
источник
None
полезно, когда вы хотите изменить значение по умолчанию. Раздельное поведение должно быть в отдельных функциях.None
также может быть полезным в качестве подлинного значения по умолчанию.Вы не можете, никогда не должны и не хотите этого.
В Python все является объектом. Классы - это вещи, поэтому они являются объектами. Как и методы.
Существует объект с именем,
A
который является классом. У него есть атрибут с именемstackoverflow
. У него может быть только один такой атрибут.Когда вы пишете
def stackoverflow(...): ...
, происходит то, что вы создаете объект, который является методом, и назначаете егоstackoverflow
атрибутуA
. Если вы пишете два определения, второе заменяет первое, так же, как присваивание всегда ведет себя.Кроме того, вы не хотите писать код, который делает самые разные вещи, для которых иногда используется перегрузка. Это не так, как работает язык.
Вместо того, чтобы пытаться определить отдельную функцию для каждого типа вещей, которые вам могут дать (что в любом случае не имеет смысла, поскольку вы не указываете типы для параметров функции), перестаньте беспокоиться о том, что это такое , и начните думать о том, что они могут сделать .
Вы не только не можете написать отдельный для обработки кортеж против списка, но и не хотите или не должны .
Все, что вы делаете, это пользуетесь тем фактом, что они оба, например, итеративны (то есть вы можете писать
for element in container:
). (Тот факт, что они не имеют прямого отношения к наследованию, не имеет значения.)источник
@overload
декоратора, я бы сказал , что « на самом деле не хотят» является спорным, в лучшем случае . Начиная с PEP-3124: «... в настоящее время Python-код является общим анти-паттерном для проверки типов полученных аргументов ...« очевидный способ »сделать это - проверка типа, но это хрупко и закрыто для расширение ... "Так что, кажется, достаточно людей хотели, чтобы он стал частью Python.@overload
только для набора текста.Хотя @agf был прав с ответом в прошлом, теперь с PEP-3124 мы получили наш синтаксический сахар. См. Печатную документацию для получения подробной информации о
@overload
декораторе, но обратите внимание, что это на самом деле просто синтаксический сахар, и ИМХО, это все, о чем люди спорят с тех пор. Лично я согласен , что наличие нескольких функций с разными подписями делает его более удобным для чтения , то имея одну функции с аргументами 20+ всех заданного значения по умолчанию (None
большую часть времени) , а затем необходимости возиться с помощью бесконечныхif
,elif
,else
цепей , чтобы выяснить , какие вызывающая сторона на самом деле хочет, чтобы наша функция работала с предоставленным набором аргументов. Это было давно пора после Python Zenи, возможно, также
Прямо из официальной документации по Python, указанной выше:
источник
@overload
функции ed не должны иметь какой-либо реальной реализации. Это не очевидно из примера в документации по Python.Я пишу свой ответ на Python 3.2.1.
Как это устроено:
overload
принимает любое количество вызываемых элементов и сохраняет их в кортежеfunctions
, а затем возвращает лямбду.functions[number_of_unnamed_args_passed]
вызываемой, с аргументами, передаваемыми в лямбду.Использование:
источник
Я думаю, что слово, которое вы ищете, это «перегрузка». В питоне нет перегрузки методов. Однако вы можете использовать аргументы по умолчанию следующим образом.
Когда вы передаете ему аргумент, он будет следовать логике первого условия и выполнять первый оператор печати. Когда вы передадите ему аргументы без аргументов, он перейдет в
else
условие и выполнит второй оператор print.источник
Я пишу свой ответ на Python 2.7:
В Python перегрузка методов невозможна; если вы действительно хотите получить доступ к одной и той же функции с различными функциями, я предлагаю вам перейти к переопределению метода.
источник
В Python перегрузка не является прикладной концепцией. Однако, если вы пытаетесь создать случай, когда, например, вы хотите, чтобы один инициализатор выполнялся, если передан аргумент типа,
foo
и другой инициализатор для аргумента типаbar
, так как все в Python обрабатывается как объект, вы можете проверить имя типа класса переданного объекта и запись условной обработки, основанной на этом.Эта концепция может быть применена к нескольким различным сценариям с помощью различных методов по мере необходимости.
источник
В Python вы бы сделали это с аргументом по умолчанию.
источник
Просто наткнулся на этот https://github.com/bintoro/overloading.py для всех, кому это может быть интересно.
Из readme связанного репозитория:
источник
Python не поддерживает перегрузку методов, как Java или C ++. Мы можем перегружать методы, но можем использовать только последний определенный метод.
Нам нужно предоставить необязательные аргументы или * args, чтобы предоставить различное количество аргументов при вызове.
Предоставлено https://www.geeksforgeeks.org/python-method-overloading/
источник
Python 3.x включает в себя стандартную библиотеку типов, которая позволяет перегружать методы с помощью декоратора @overload. К сожалению, это должно сделать код более читабельным, так как за декорированными методами @overload должен следовать не декорированный метод, который обрабатывает разные аргументы. Больше можно найти здесь, но для вашего примера:
источник
В файле MathMethod.py
В файле Main.py
Мы можем перегрузить метод с помощью multipledispatch
источник
Python добавил декоратор @overload с PEP-3124, чтобы обеспечить синтаксический сахар для перегрузки с помощью проверки типов - вместо того, чтобы просто работать с перезаписью.
Пример кода по перегрузке через @overload из PEP-3124
преобразуется @ overload-decorator в:
источник