Перегрузка методов C++ в Python

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

1
задан DumbCoder 13 August 2010 в 12:13
поделиться

4 ответа

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

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

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

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

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

0
ответ дан 2 September 2019 в 22:11
поделиться

В этой статье рассказывается о том, как мультиметодный декоратор может быть создан на 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...
-2
ответ дан 2 September 2019 в 22:11
поделиться

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

Красивое лучше уродливого.
Явное лучше, чем неявное.
Лучше простое, чем сложное.
...

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

1
ответ дан 2 September 2019 в 22:11
поделиться

Обычно вас устраивает любая комбинация

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

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

3
ответ дан 2 September 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: