Funktionen überladen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
maurice
User
Beiträge: 4
Registriert: Donnerstag 20. November 2003, 20:24

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.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
maurice
User
Beiträge: 4
Registriert: Donnerstag 20. November 2003, 20:24

Dank euch, dann wird das bei pygame wohl auch so ähnlich gemacht worden sein.
Antworten