Seite 1 von 1

Funktionen überladen

Verfasst: Montag 8. Dezember 2003, 18:09
von maurice
Hallo,

bei der pygame-Library gibt es eine Klasse 'Rect'. Dort funktioniert nun folgendes:

Code: Alles auswählen

rc = Rect(0,1,2,3)

oder

rc = Rect( (0,1,2,3) )

oder

rc = Rect( [0,1,2,3] )

oder

rc1 = Rect(0,1,2,3)
rc2 = Rect(rc1)
Frage: Wie wurde das möglich? Wie muss die __init__-Methode aussehen, dass man sowohl die Daten einzeln als Parameter angeben kann, als auch über ein Tupel oder über eine Liste?

Ich hab versucht das anhand des Pygame-Quelltextes rauszufinden, aber dort ist das irgendwie alles in C geschrieben.

Verfasst: Montag 8. Dezember 2003, 18:28
von Milan
Hi.

Wie es genau geamcht wurde weiß ich auch nicht, aber du kannst mit type(x) den Variablentyp von x abfragen, während du mit isinstance (obj, class/type) abfargen kannst, ob obj eine Instanz einer Klasse oder eines bestimmten Types ist. Es könnte also zum Beispiel stehen:

Code: Alles auswählen

...
def __init__(self, a,b=None,c=None,d=None):
    if type(a) in (tuple,list):
        ...#anweisungsblock für Rect( [0,1,2,3] )  und Rect( (0,1,2,3) ), parameter in a
    elif isinstace(a, Rect):
        self=a
    else:
        ...#anweisungsblock für Rect(0,1,2,3); parameter in a,b,c,d
Ich hab allerdings keine Ahnung, wie das ganze in C gemacht wird...

Verfasst: Montag 8. Dezember 2003, 19:19
von Dookie
Hi maurice,

mal ausforumuliert für die drei Möglichkeiten:

Code: Alles auswählen

def __init__(self, a, b=0, c=0, d=0):
    if type(a) in (list, tuple):
        self.x, self.y, self.w, self.h = a
    elif isinstance(a, Rect):
       self.x, self.y self.w, self.h = a.x, a.y, a.w, a.h
    else:
        self.x = a
        self.y = b
        self.w = c
        self.h = d
Gruß

Dookie

Verfasst: Montag 8. Dezember 2003, 22:25
von maurice
Dank euch, dann wird das bei pygame wohl auch so ähnlich gemacht worden sein.