Verschiebung von Punkt in 2D

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
Cleo_DaVinci
User
Beiträge: 6
Registriert: Samstag 3. Juli 2021, 11:55

Hallo,
ich habe bereits eine Klasse und Funktion definiert, mit welchen man einen Punkt im kartesischen KoSy in 2D erstellen kann. Der Code sieht wie folgt aus:

Code: Alles auswählen

class point:
    
    counter = 0
    
    def new_point(self, x, y): 
        self.x = x
        self.y = y
        type(self).counter += 1
        
Nun möchte ich eine Methode namens move() definieren, die diesen erstellten Punkt verschiebt.
Aber leider funktioniert dieser Code nicht:

Code: Alles auswählen

def move(self, dx, dy):
        x = dx
        y = dy
Kann mir jemand helfen? Vielen Dank!
Cleo
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist eine schlechte Klasse. Die Methode new_point macht man so nicht, sondern nutzt den Konstruktor (oder streng genommen Initialisator) __init__, um das Objekt direkt bei Erzeugung vernünftig aufzubauen.

Und zu deinem Problem: du nutzt doch schon self.x und den += Operator. Warum nicht auch in move?
dirk009
User
Beiträge: 27
Registriert: Donnerstag 3. Juni 2021, 21:49

Hallo Cleo,

um Deets Post zu veranschaulichen:

Code: Alles auswählen

class Point:
    
    _counter = 0
    
    def __init__(self, x, y):
        self.x = x
        self.y = y
        Point._counter += 1

    def move(self, dx, dy):
        self.x += dx
        self.y += dy

    def set_location(self, x, y):
         self.x = x
         self.y = y

    def __str__(self):
          str = "x: {} y: {} (counter: {})".format(self.x, self.y, Point._counter)
          return str

def main():
    origin = Point(0, 0)
    print(origin)
    origin.move(1, 1)
    print(origin)
    origin.set_location(0, 0)
    print(origin)
    one_right_one_up = Point(0, 1)
    print(one_right_one_up)
    
    

if __name__ == "__main__":
    main()
Der Code ergibt folgende Ausgabe:

Code: Alles auswählen

x: 0 y: 0 (counter: 1)
x: 1 y: 1 (counter: 1)
x: 0 y: 0 (counter: 1)
x: 0 y: 1 (counter: 2)
Cheers,
Dirk
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Das counter-Attribut ist ziemlich unnütz. Was hilft Dir die Angabe, wie oft eine Funktion aufgerufen worden ist?
Klassen schreibt man nach Konvention mit großem Anfangsbuchstaben.
Eine Klasse braucht immer eine __init__-Methode, in der alle Attribute initialisiert werden.

@dirk009: das `str` in `__str__´ ist schlecht, weil es den eingebauten Typ `str` überdeckt, und ist eigentlich auch gar nicht nötig.
Heutzutage benutzt man f-Strings:

Code: Alles auswählen

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def move(self, dx, dy):
        self.x += dx
        self.y += dy

    def set_location(self, x, y):
         self.x = x
         self.y = y

    def __str__(self):
          return "x: {self.x} y: {self.y}"
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Nur eine Kleinigkeit:

Code: Alles auswählen

return f"x: {self.x} y: {self.y}"
Es fehlt das f vom f-String
Benutzeravatar
NoPy
User
Beiträge: 158
Registriert: Samstag 28. Dezember 2013, 12:39

wieder was gelernt.

Noch eine Anmerkung zum obersten Posting: Ganz offenbar besteht unterschiedliche Auffassung dazu, was die Funktion move tun soll. Verschiebt sie den Punkt AUF eine neue Position, wie im obersten Posting postuliert oder UM einen Vektor?
dx, dy legen nahe, dass der zweite Fall gemeint ist
die Implementierung löst aber das erstgenannte Problem.

Vielleicht benötigt die Klasse 2 Funktionen, move_abs/move_rel, move_to/move, set_location/move (siehe dirk009)

Das, was Du vielleicht mit "funktioniert nicht" meinst, ist, dass Du nicht die Member- Variablen x und y, sondern lokale Variablen x und y gesetzt hast. Python ist diesbezüglich tolerant. Du bekommst, was Du schreibst. Du könntest es ja so gemeint haben.
Antworten