предположите, что класс 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? спасибо ~
I think these two are overloaded methods, which one to use depends on the parameters, right?
Извините, если покажется, что я придираюсь, но просто подумал о том, чтобы четко обозначить эту разницу.
Термины параметры и аргументы имеют очень специфическое значение в C++
аргумент: выражение в разделенном запятыми списке, ограниченном круглыми скобками в выражении вызова функции, последовательность лексем предварительной обработки в разделенном запятыми списке, ограниченном круглыми скобками в макровызове функции, операнд throw, или выражение, type-id или template-name в разделенном запятыми списке, ограниченном угловыми скобками в инстанцировании шаблона. Также известен как фактический аргумент или фактический параметр.
параметр: объект или ссылка, объявленный как часть объявления или определения функции или в выражении catch обработчика исключений, который приобретает значение при входе в функцию или обработчик; идентификатор из разделенного запятыми списка, ограниченного круглыми скобками сразу после имени макроса в макроопределении функции; или параметр шаблона. Параметры также известны как формальные аргументы или формальные параметры
В этой статье рассказывается о том, как мультиметодный декоратор может быть создан на 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...
Это действительно зависит от того, чем вы хотите заниматься. Метод * 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]: импортируйте этот
Дзен Питона, Тим ПитерсКрасивое лучше уродливого.
Явное лучше, чем неявное.
Лучше простое, чем сложное.
...
Если ваш шаблон красив, ясен и прост, он может быть правильным для использования.
Обычно вас устраивает любая комбинация
def __init __ (self, x = 0.0, y = 0.0, z = 0.0)
) Если это кажется невозможным, постарайтесь усерднее;) Если это все еще кажется невозможным, посмотрите ссылку Дэвида.