2010-08-13 4 views
1

Предположим, что класс 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

ответ

0
I think these two are overloaded methods, which one to use depends on the parameters, right? 

Извините, если я, кажется, задираю, но просто подумал о том, чтобы четко понять это различие.

Термин параметры и аргументы имеют очень специфическое значение в C++

аргумент: выражение в списке разделенных запятыми, ограниченной скобках в выражении вызова функции, последовательность предварительной обработки маркеров в списке через запятую ограниченный круглыми скобками в функционально-подобном вызове макроса, операнд throw или выражение, идентификатор типа или имя шаблона в сопоставленном списке, ограниченном угловыми скобками в экземпляре шаблона. Также известен как фактический аргумент или фактический параметр.

параметр: объект или ссылка, объявленная как часть объявления функции или определения, или в предложении catch обработчика исключений, который получает значение при входе в функцию или обработчик; идентификатор из сопоставленного списка, ограниченного скобками, сразу после имени макроса в определении макрокоманды; или шаблон-параметр. Параметры также известны как формальные аргументы или формальные параметры

+1

-1 для ответа на вопрос, +0.1 за право = -0.9, который округляется до -1;) – delnan

+0

спасибо, очень полезно, это нормально о -1 – ladyfafa

+3

Кстати, C++ поддерживает округление в направлении 0 :) int main() {double d = -1 + 0,1; int x = d; cout << x; } – Chubsdad

-2

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... 
+0

Да, это может быть очень приятное решение для некоторых подобных проблем, я беспокоюсь, что, если количество аргументов в конструкторе зависит друг от друга, а не только от типов? Как сказано в этой статье «Итак, что такое мультиметоды? Я дам вам свое определение, поскольку я понял их: функция, которая имеет несколько версий, отличающихся типом аргументов». – ladyfafa

+0

@ladyfafa: При взгляде на вещи вы могли бы иметь версии функции с различным количеством аргументов. Декоратор, который они предоставляют, по-видимому, просто отображает заданный кортеж типов (например, '(int, int)') на '* args', чтобы решить, какую версию метода вызывать. – David

+0

Есть ли в python модуль, называемый mm? – ladyfafa

3

Обычно, вы хорошо с любой комбинацией

  • слегка измененным дизайном
  • аргументов по умолчанию (def __init__(self, x = 0.0, y = 0.0, z = 0.0))
  • использование полиморфизма (в утиный язык, вам не нужна перегрузка для SomeThing vs SomeSlightlyDifferentThing, если они не наследуются от другого, если их интерфейсы достаточно похожи).

Если это не представляется возможным, старайтесь;) Если это все еще не представляется возможным, посмотрите на ссылку Дэвида.

+0

спасибо за ответ – ladyfafa

1

Это действительно зависит от того, что вы хотите сделать. Метод * 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, Тим Питерс

Красивая лучше, чем некрасиво.
Явный лучше, чем неявный.
Простой лучше, чем сложный.
...

Если ваш шаблон красиво, четко и просто, это просто может быть правильным использовать.

Смежные вопросы