Предположим, что класс C++ имеет несколько конструкторов, которые перегружены в соответствии с числом и типом и последовательностями их соответствующих параметров, например constructor(int x, int y)
и constructor(float x, float y, float z)
. Я думаю, что эти два являются перегруженными методами, которые можно использовать по параметрам, правильно? Итак, в python, как я могу создать конструктор, который может работать так? Я заметил, что у python есть def method(self, *args, **kwargs):
, поэтому я могу использовать его как: def __init__(self, *args)
, затем я проверяю длину *args
, например if len(args) == 2:
, затем конструируем в соответствии с конструктором 2-параметров, if len(args) == 3
, затем используйте конструктор 3-параметров и т. Д. Итак, это работает? Или есть ли лучший способ сделать это с помощью python? Или я должен думать другими способами, которые могли бы воспользоваться преимуществом самой функции python? спасибо ~Перегрузка методов C++ в python
ответ
I think these two are overloaded methods, which one to use depends on the parameters, right?
Извините, если я, кажется, задираю, но просто подумал о том, чтобы четко понять это различие.
Термин параметры и аргументы имеют очень специфическое значение в C++
аргумент: выражение в списке разделенных запятыми, ограниченной скобках в выражении вызова функции, последовательность предварительной обработки маркеров в списке через запятую ограниченный круглыми скобками в функционально-подобном вызове макроса, операнд throw или выражение, идентификатор типа или имя шаблона в сопоставленном списке, ограниченном угловыми скобками в экземпляре шаблона. Также известен как фактический аргумент или фактический параметр.
параметр: объект или ссылка, объявленная как часть объявления функции или определения, или в предложении catch обработчика исключений, который получает значение при входе в функцию или обработчик; идентификатор из сопоставленного списка, ограниченного скобками, сразу после имени макроса в определении макрокоманды; или шаблон-параметр. Параметры также известны как формальные аргументы или формальные параметры
This article рассказывает о том, как в Python может быть создан декоратор с несколькими мерами. Я не пробовал код, который они дают, но синтаксис, который он определяет, выглядит довольно неплохо. Вот пример из статьи:
from mm import multimethod
@multimethod(int, int)
def foo(a, b):
...code for two ints...
@multimethod(float, float):
def foo(a, b):
...code for two floats...
@multimethod(str, str):
def foo(a, b):
...code for two strings...
Да, это может быть очень приятное решение для некоторых подобных проблем, я беспокоюсь, что, если количество аргументов в конструкторе зависит друг от друга, а не только от типов? Как сказано в этой статье «Итак, что такое мультиметоды? Я дам вам свое определение, поскольку я понял их: функция, которая имеет несколько версий, отличающихся типом аргументов». – ladyfafa
@ladyfafa: При взгляде на вещи вы могли бы иметь версии функции с различным количеством аргументов. Декоратор, который они предоставляют, по-видимому, просто отображает заданный кортеж типов (например, '(int, int)') на '* args', чтобы решить, какую версию метода вызывать. – David
Есть ли в python модуль, называемый mm? – ladyfafa
Обычно, вы хорошо с любой комбинацией
- слегка измененным дизайном
- аргументов по умолчанию (
def __init__(self, x = 0.0, y = 0.0, z = 0.0)
) - использование полиморфизма (в утиный язык, вам не нужна перегрузка для SomeThing vs SomeSlightlyDifferentThing, если они не наследуются от другого, если их интерфейсы достаточно похожи).
Если это не представляется возможным, старайтесь;) Если это все еще не представляется возможным, посмотрите на ссылку Дэвида.
спасибо за ответ – ladyfafa
Это действительно зависит от того, что вы хотите сделать. Метод * args/** kwargs работает достаточно хорошо, как и аргументы по умолчанию, которые предлагает delnan.
Основное различие между C++ и Python в данном случае является то, что и почему того, что вы пытаетесь сделать. Если у вас есть класс, которому нужны float, просто попробуйте использовать аргументы как float.Вы также можете полагаться на аргументы по умолчанию расшириться логику:
class Point(object):
def __init__(self, x=0.0, y=0.0, z=None):
# Because None is a singleton,
# it's like Highlander - there can be only one! So use 'is'
# for identity comparison
if z is None:
self.x = int(x)
self.y = int(y)
self.z = None
else:
self.x = float(x)
self.y = float(y)
self.z = float(z)
p1 = Point(3, 5)
p2 = Point(1.0, 3.3, 4.2)
p3 = Point('3', '4', '5')
points = [p1, p2, p3]
for p in points:
print p.x, p.y, p.z
Вы не делаете, конечно, должны назначить self.z = None
, это было просто для удобства моего примера.
За лучший совет о том, какой шаблон использовать,
В работе [17]: импорт этого
Дзен Python, Тим ПитерсКрасивая лучше, чем некрасиво.
Явный лучше, чем неявный.
Простой лучше, чем сложный.
...
Если ваш шаблон красиво, четко и просто, это просто может быть правильным использовать.
- 1. Перегрузка методов
- 2. Перегрузка общих методов и методов
- 3. Python наследование, перегрузка методов и декорирование
- 4. Перегрузка оператора с помощью методов расширения C#
- 5. GroovyRuntimeException: Перегрузка неоднозначных методов
- 6. Переопределение/перегрузка методов интерфейса
- 7. Swift - Перегрузка статических методов
- 8. Перегрузка методов расширения
- 9. Перегрузка методов PHP
- 10. Перегрузка общих методов
- 11. Перегрузка методов STL STL
- 12. Перегрузка общих методов в Scala
- 13. Перегрузка методов с одинаковыми сигнатурами
- 14. Метод украшения (перегрузка методов класса)
- 15. Общая перегрузка интерфейса для методов?
- 16. перегрузка unittest.testcase в python
- 17. Перегрузка абстрактных методов в абстрактном классе
- 18. перегрузка магических методов в дочерних классах
- 19. Перегрузка ** в C++
- 20. Перегрузка в python - pandas
- 21. Перегрузка оператора Python
- 22. Перегрузка Python __init__
- 23. Перегрузка друга и перегрузка оператора в C++
- 24. Перегрузка троичного оператора python
- 25. Перегрузка C++ `-`
- 26. Groovy - Перегрузка неоднозначных методов для метода
- 27. Перегрузка сложения оператора C#
- 28. Перегрузка оператора в C++
- 29. Перегрузка оператора в C++
- 30. Перегрузка оператора в C++
-1 для ответа на вопрос, +0.1 за право = -0.9, который округляется до -1;) – delnan
спасибо, очень полезно, это нормально о -1 – ladyfafa
Кстати, C++ поддерживает округление в направлении 0 :) int main() {double d = -1 + 0,1; int x = d; cout << x; } – Chubsdad