Interaktive Sitzung in Shell nach Programmcode-Ausführung

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
davidoteles
User
Beiträge: 4
Registriert: Montag 12. November 2018, 14:42

Montag 12. November 2018, 14:50

Hallo liebe Mitglieder,

da ich neu hier bin und auch neu in Python einsteige, möchte ich bevor ich meine Frage stelle gerne einmal Hallo sagen :)

Nun zur Frage: In pycharme habe ich das folgende kurze Programm eingegeben (habe Pythin 3.7 im Moment):
-----------------------------------------------------------------------------------------------------------------------------------------------
from math import *


class vektor(object):
x = None
y = None

def vorgabe(self, x, y):
self.x = float(x)
self.y = float(x)

def rueckgabe(self):
return self.x, self.y

def eingabe(self):
self.x = float(input("x eingeben:"))
self.y = float(input("y eingeben:"))

def ausgabe(self):
if self.x is None or self.y is None:
print("Es wurde noch kein Vektor definiert!")
else:
betrag = sqrt(self.x**2+self.y**2)
print("x:", self.x)
print("y:", self.y)
print("Der Betrag ist:", betrag)
-----------------------------------------------------------------------------------------------------------------------------------------------

Nun habe ich das Programm ausgeführt und wollte in der Shell beginnen damit etwas anzufangen. Dazu habe ich zunächst "v = vektor()" schreiben wollen und anschließend "v.ausgabe()"
Leider zeigt mir dann aber pycharme folgende Fehlermeldung an.

"v = vektor()
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'vektor' is not defined"

Hier weiß ich leider nicht mehr weiter... :(
Wisst ihr vielleicht was hier der Fall ist?

Gruß
KingDingeling
Benutzeravatar
ThomasL
User
Beiträge: 424
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Montag 12. November 2018, 15:24

Dein Programm hat einen Dateinamen z.B. vektor.py
Dann gebe mal auf der Shell ein
import vektor
v = vektor.vektor()

Aus Zeitmangel kann ich leider nicht weiter auf deinen Code eingehen, aber da ist vieles nicht optimal.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
davidoteles
User
Beiträge: 4
Registriert: Montag 12. November 2018, 14:42

Montag 12. November 2018, 17:02

Hi und vielen Dank für die schnelle Rückmeldung, sehr freundlich.

Mein Programm heißt "Starting.py" und ich habe eingegeben und erhalten:

import Starting
v = vektor.vektor()
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'vektor' is not defined

Habe ich wiederholt etwas falsch gemacht?

Gruß
Davidoteles
davidoteles
User
Beiträge: 4
Registriert: Montag 12. November 2018, 14:42

Montag 12. November 2018, 17:06

Ich habe die Antwort durch ausprobieren gefunden:

Es muss da anfangs stehen: "from 'Dateiname' import *" und dann kann es losgehen!
Benutzeravatar
__blackjack__
User
Beiträge: 1599
Registriert: Samstag 2. Juni 2018, 10:21

Montag 12. November 2018, 17:36

@davidoteles: Das mit dem Sternchen-Import ist in einer Python-Shell halbwegs okay, obwohl es auch dort nicht ungefährlich ist, aber bitte mach so etwas nicht in Quelltexten von Modulen.

Besser wäre auch in der Shell entweder über den Modulnamen zu gehen oder explizit die Namen zu importieren die Du verwenden möchtest, statt einfach *alles*.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Sirius3
User
Beiträge: 8817
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 12. November 2018, 17:47

@davidoteles: Sternchen-Importe vermeiden. Immer die konkreten Namen angeben, weil sonst nicht kontrolliert werden kann, was da alles in den eigenen Namensraum importiert wird. Bei math werden z.B. knapp 50 Namen importiert.
Klassen schreibt man nach Konvention GroßKlein, also Vector.
Man sollte keine Klassenattribute mit Instanzattributen mischen. Attribute werden in __init__ angelegt. Es ist unüblich dafür eine eigene Methode zu verwenden, vor allem weil es dann uninitialisierte Instanzen gibt, wie Du ja selbst in `ausgabe` merkst.
Methoden sollten wie Funktionen nach Tätigkeiten benannt werden, keine Deiner Methoden ist eine Tätigkeit.

Code: Alles auswählen

class Vektor(object):
    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(x)

    @classmethod
    def generate_from_input(cls):
        x = input("x eingeben:")
        y = input("y eingeben:")
        return cls(x, y)

    def get_coordinates(self):
        return self.x, self.y

    def get_length(self):
        return (self.x**2 + self.y**2) ** 0.5

    def output(self):
        print("x:", self.x)
        print("y:", self.y)
        print("Der Betrag ist:", self.get_length())

v = Vector.generate_from_input()
v.output()
davidoteles
User
Beiträge: 4
Registriert: Montag 12. November 2018, 14:42

Montag 12. November 2018, 18:43

Recht herzlichen Dank für eure Antworten und Hinweise! Sehr freundlich von euch.

Ich wünsche noch einen schönen Start in die Woche! :)

Gruß KingDingeling
Antworten