Przeciążanie metod

0

Cześć,

To mój pierwszy post na tym forum.
Wdrażam się w Pythona (na co dzień programuję w Ruby i trochę w Javie).
Moje pytanie:
Czy można w Pythonie przeciążać metody, tzn. tworzyć kilka metod o tej samej nazwie, ale o różnej ilości argumentów ?
Chodzi mi o przeciążenie w tej samej klasie, czyli nie o przesłanianie jako nadpisywanie metody w klasie potomnej.
Próbowałem i nowa metoda o tej samej nazwie w danej klasie powodowała, że ta wcześniejsza metoda przestała być w użyciu.
Ale może jest jakiś pythonowy sposób na typowe przeciążenie ?

1

Tak jak w Javie czy ````C++``` to nie ale są sposoby:

def add(*args):
    return sum(args)
>>> add(1, 2)
3
>>> add(1, 2, 3)
6
>>> add(1, 2, 3, 4)
10

args staje się listą (dokładniej tuple) podanych argumentów, czyli tą samą funkcję można wywoływać z różna ilością paramaetrów i różnych typów.
Można też tak(keyword parameter):

def add(arg1, arg2=None):
	if arg2 is not None:
		return arg1 + arg2
	else:
		return arg1 ** 2

Tą funkcję można wołać od jednego lub dwóch argumentów.

1

W Pythonie 3.8 doszło też functools.singledispatchmethod:

>>> import functools
>>> 
>>> class Foo:
...     @functools.singledispatchmethod
...     def fun(self, arg):
...         raise NotImplementedError()
...     @fun.register
...     def _(self, arg: int):
...         print("Wywołano dla int: {}".format(arg))
...     @fun.register
...     def _(self, arg: str):
...         print("Wywołano dla str: {}".format(arg))
... 
>>> f = Foo()
>>> f.fun(10)
Wywołano dla int: 10
>>> f.fun("test")
Wywołano dla str: test
>>> f.fun([1, 2, 3])
`Traceback (most recent call last):
  File ".code.tio", line 17, in <module>
    f.fun([1, 2, 3])
  File "/usr/lib64/python3.8/functools.py", line 911, in _method
    return method.__get__(obj, cls)(*args, **kwargs)
  File ".code.tio", line 6, in fun
    raise NotImplementedError()
NotImplementedError

Ale nie nadużywajcie tego ;)

@from_ruby_to_python opisz co chcesz zrobić, do doradzimy precyzyjniej

0

Wielkie dzięki za szybkie i pomocne odpowiedzi :)
W sumie to nic takiego nie chcę zrobić. Ćwiczę i staram się przestawić mentalnie na Pythona.

1 użytkowników online, w tym zalogowanych: 0, gości: 1