Перегрузка методов C ++ в python - PullRequest
1 голос
/ 13 августа 2010

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

Ответы [ 4 ]

3 голосов
/ 13 августа 2010

Обычно с любой комбинацией

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

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

1 голос
/ 13 августа 2010

Это действительно зависит от того, что вы хотите сделать.Метод * args / ** kwargs работает довольно хорошо, как и аргументы по умолчанию, которые предлагает delnan.

Основное различие между C ++ и Python в этом случае заключается в what и почему того, что вы пытаетесь сделать.Если у вас есть класс, которому нужны числа с плавающей точкой, попробуйте привести аргументы как число с плавающей точкой.Вы также можете полагаться на аргументы по умолчанию для ветвления своей логики:

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]: импортируйте этотДзен Питона, Тим Питерс

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

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

0 голосов
/ 13 августа 2010

В этой статье рассказывается о том, как в 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 голосов
/ 13 августа 2010
I think these two are overloaded methods, which one to use depends on the parameters, right? 

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...