Seite 1 von 1
Verschiebung von Punkt in 2D
Verfasst: Samstag 3. Juli 2021, 12:02
von Cleo_DaVinci
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:
Kann mir jemand helfen? Vielen Dank!
Cleo
Re: Verschiebung von Punkt in 2D
Verfasst: Samstag 3. Juli 2021, 12:56
von __deets__
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?
Re: Verschiebung von Punkt in 2D
Verfasst: Samstag 3. Juli 2021, 13:18
von dirk009
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
Re: Verschiebung von Punkt in 2D
Verfasst: Samstag 3. Juli 2021, 14:12
von Sirius3
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}"
Re: Verschiebung von Punkt in 2D
Verfasst: Samstag 3. Juli 2021, 14:20
von rogerb
Nur eine Kleinigkeit:
Es fehlt das f vom f-String
Re: Verschiebung von Punkt in 2D
Verfasst: Donnerstag 8. Juli 2021, 09:24
von NoPy
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.