ich würde gerne Versuchen in Python meinen eigenen "overload"-Dekorator zu schreiben. Soweit so gut. Mein Problem tritt nun auf, wenn ich eine Methode überladen will und als Eingangsvariable ein Objekt der gleichen Klasse habe. Hat jemand eine Idee, wie ich das Problem umgehen kann (außer eine andere Sprache verwenden
Die Overload-Klasse
Code: Alles auswählen
class Overload:
functions = {}
def __init__(self, *types):
self.types = types
def wrapper(self, *args):
if args:
type_list = tuple(map(lambda x: type(x), args))
else:
type_list = (None,)
if type_list in self.functions[self.name].keys():
return self.functions[self.name][type_list](*args)
else:
raise AttributeError(
"Overloaded method for Args:\n'" + "%s" * len(type_list) % type_list + "'\nDoes not exist")
def __call__(self, f):
self.name = f.__name__
type_list = tuple(self.types[:])
if self.name not in self.functions.keys():
self.functions[self.name] = {}
self.functions[self.name][type_list] = f
return self.wrapper
und hier ein Beispiel bei welchem das Problem auftritt:
Code: Alles auswählen
class Dummy:
def __init__(self, value):
self.value = value
@Overload(Dummy, Dummy)
def __add__(self, other):
return self.value + other.value
@Overload(Dummy, int)
def __add__(self, other):
return self.value + other
Hat es hier einen Vorteil statt "type() == <type>", "isinstance(<var>, <type>)" zu benutzen?
Und hier noch schnell der Fehler:
Code: Alles auswählen
Traceback (most recent call last):
File "...\test.py", line 58, in <module>
class Dummy:
File "...\test.py", line 63, in Dummy
@Overload(Dummy, Dummy)
NameError: name 'Dummy' is not defined
