Passwort abfrage

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Naja ich muss mal meckern snafu ;)

Code: Alles auswählen

def get_fueltype(self):
        return self.fueltype
Man braucht keine simplen Getter(/Setter)

Code: Alles auswählen

def fill_up(self, type): # beschreibt die Tätigkeit des Auffüllens
        if type == 'benzine':
            self.fuel = True
        elif type == 'oil':
            self.oil = True
Du überschreibst `type' -> Böse :)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mit dem "type" ist mir selber aufgefallen (siehe EDIT) und gut, das andere kann man sich sparen. Die Reifen hab ich mir ja auch anders angeguckt...
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python

class Fahrzeug(object):
    def __init__(self):
        self.fueltype = None
        self.candrive = False
        self.oil = None
        
    def fill_up(self):
        return self.fueltype
    
    def drive(self):
        if self.candrive == True:
            return "Dein Fahrzeug startet"
        else:
            return "Dein Fahrzeug kann nicht Fahren"
    
    def oil(self):
        return self.oil
    
    
class auto(Fahrzeug):
    def __init__(self):
        self.fueltype = "Benzin"
    
    def putoil(self):
        self.oil = "Standart Oel"
        
    def driving(self):
        if self.fueltype == "Benzin" and self.oil == "Standart Oel":a
            self.candrive = True

Auf das ihr mich zu gund und boden berichtigt!
Grüß , Rootmentor
_____________________________________________
Die unendlichkeit dauert lang , besonders bis zum Ende
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Auf das ihr mich zu gund und boden berichtigt!
-> Auf, dass ihr mich zu Grund und Boden berichtigt!

Du wolltest es so *g*

Ich weiss jetzt ehrlich gesagt nicht, wie ich das bewerten soll. Es ist schliesslich kein echter Code sondern eher ein Gedankenspiel. So fehlen halt so Dinge wie das Volumen beim Öl oder Benzin/Diesel.

Aber so ein paar Sachen sag ich dann doch mal ;)

Code: Alles auswählen

class Fahrzeug(object):
    def __init__(self):
        self.fueltype = None
        self.candrive = False
        self.oil = None 
Würde ich in

Code: Alles auswählen

class Vehicle(object):
    def __init__(self, fueltype=None, oil=None, rideable=False):
        self.fueltype = fueltype
        self.oil = oil
        self.rideable = rideable
ändern. Einfach damit diese Werte gleich initialiisiert werden können.

Code: Alles auswählen

    def fill_up(self):
        return self.fueltype
   
    def drive(self):
        if self.candrive == True:
            return "Dein Fahrzeug startet"
        else:
            return "Dein Fahrzeug kann nicht Fahren"
   
    def oil(self):
        return self.oil 
Sind nichts anderes als einfache Getter. Darauf kannst du verzichten.

Zum `auto' sag ich jetzt mal nichts mehr. Ausser: Hard coding is evil(tm).
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Funktionale Programmierung ist dazu gedacht, externe Eingaben weiterzuverarbeiten. Das ist bei dir nicht möglich, da deine Funktionen keinerlei Parameter eingebaut haben.

Ich habe dir neben "fill_up()" explizit beschrieben, dass dies die Tätigkeit des Auffüllens beschreibt. Der Name der Funktion beschreibt also deren Sinn, wenn man so will (Stichwort: "sprechende Namen"). Bei dir tut sie etwas ganz anderes: Sie gibt die Kraftstoffart zurück. Folglich müsste sie "get_fueltype()" heißen. Zudem handelt es sich bei der Funktion um einen sogenannten Getter (da rächt es sich, dass ich mit schlechtem Beispiel voran gegangen bin). Das heißt: Du gibst ein Attribut zurück, dessen Wert man auch direkt über "self.fueltype" erhalten kann. Dieser zusätzliche Schritt ist schlichtweg unnötig.

Zum Auto: Während du den Kraftstofftyp korrekterweise in den Konstruktor setzt, baust die Art des Öls gesondert in "putoil()" ein. Abgesehen davon, dass es auch hier nicht um's Einfüllen des Öls, sondern vielmehr um "set_oiltype()" geht, könntest du ja hier zu Übung mal mit Parametern arbeiten:

Code: Alles auswählen

def set_oiltype(self, oiltype):
    if oiltype == 'motoroil':
        self.oil = True # dann muss self.oil aber vorher "False" statt "None" sein
    else:
        return "I won't drink that"
Zum Schluss würde ich auch wieder "driving()" entsprechend umbennen. Schliesslich geht es ja erst einmal um die Fahrtüchtigkeit des Autos. Das eigentliche Losfahren übernimmt die Funktion "drive()". Das if-Statement macht übrigens herzlich wenig Sinn, da bei deiner Klasse ohnehin kein anderer Wert als "Benzin" angenommen werden kann und in der jetzigen Form auch kein anderer Wert als "Standart Oel".

Ich hoffe du kannst durch die Kritik etwas für deine zukünftigen Klassen mitnehmen. ;)

Sebastian
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

okay ich glaube mit einem pizza bestell programm könnte man ein gutes beispiel machen oder sehe ich das falsch?
Ich hab das mal bei youtube gesehn.
pizza.py -parameter -a - b -c -d
und dann is wirklich ne pizza nachher gekommen xD
warscheinlich gibts da nen pizza online bestell service.
Aber soweit wollt ich garnicht gehn.

ähh frage: Was soll das heißen "gleich initialisiert"?^^


Gruß , Rootmentor
_____________________________________________
Die unendlichkeit dauert lang , besonders bis zum Ende
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Rootmentor hat geschrieben:Was soll das heißen "gleich initialisiert"?
Die Initialisierung findet in dem Moment statt wo du sagst:

Code: Alles auswählen

car = drivable.Car()
Dann wird "__init__" abgearbeitet (der Konstruktor). Cofi gibt den drei Variablen "fueltype", "oil", "rideable" dabei jeweils ein None mit, wodurch sowas möglich wird:

Code: Alles auswählen

vehicle = Vehicle(fueltype='benzine', oil='motor oil', rideable=True)
Das sind sogenannte Keyword-Argumente. Man legt dabei bestimmte Standardwerte fest, die eben gelten solange sie nicht verändert werden. Du könntest auch nur den fueltype umstellen, dann bleibt der Rest bei den Werten, wie sie in der Funktion angegeben wurden.

Deine Pizzaklasse könnte z.B. so initialisiert werden:

Code: Alles auswählen

class Pizza(object):
    def __init__(self, cheese='single'):
        self.cheese = cheese
    [...]
    def get_prize(self):
        if self.cheese == 'double':
            self.price += 0.5 # also 50cent Aufschlag bei doppelt Käse
Zuletzt geändert von snafu am Samstag 11. Oktober 2008, 12:43, insgesamt 1-mal geändert.
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

achso alles klar :idea:
_____________________________________________
Die unendlichkeit dauert lang , besonders bis zum Ende
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

Ich glaub jetzt hab ichs verstanden xD

Code: Alles auswählen

class pizza(object):
    def __init_(self , grosse = "klein" , belag = "none"):
        self.grosse = "klein"
        self.belag = "belag"
        
        
    def order(self , grosse , belag):
        print "your pizza is " , grosse , "with " , belag
        
            
            

p = pizza()
p.order("klein" , "schinken")
_____________________________________________
Die unendlichkeit dauert lang , besonders bis zum Ende
BlackJack

Ich glaube nicht, dass Du's jetzt verstanden hast. `pizza.order()` ist völlig unabhängig von dem `pizza`-Exemplar, also keine richtige Methode, sondern eigentlich eine Funktion.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Klassen sollten mit einem Großbuchstaben anfangen.

Wenn du keine Umlaute verwenden willst, dann schreib doch gleich "size". :)

Es ist wesentlich lesbarer, wenn man nicht nach jedem Komma noch ein Leerzeichen setzt.
Gleichzeichen in Klammern würde ich ganz ohne Leerzeichen schreiben.

None ist ein reserviertes Wort in Python, das man in solchen Fällen auch ruhig verwenden sollte. Dein "none" ist ja einfach nur ein String.

Beim Zugriff auf eine Variable macht man keine Anführungszeichen (denn die stehen für einen String). Zudem muss "self.grosse" auch an "grosse" und nicht wie bei dir an "klein" gebunden sein.

Weiterhin solltest du dich schon entscheiden, ob du die Argumente bei der Bestellfunktion oder bei der Initialisierung mitgeben willst. Für letzteres wäre dies eine mögliche Lösung:

Code: Alles auswählen

class Pizza(object):

    def __init__(self, size='normal', topping=None):
        self.size = size
        self.topping = topping
        
    def order(self):
        print 'Your %s pizza with %s has been ordered' % (self.size, self.topping)
            

def main():
    p = Pizza('small', 'ham')
    p.order()
Möchte man das ganze etwas realistischer gestalten, würde man "order()" außerhalb einer Klasse schreiben. Dann können nämlich auch mehrere "Pizza()"-Instanzen in eine Bestellung aufgenommen werden:

Code: Alles auswählen

ham = Pizza(size=small, topping='ham')
peperoni = Pizza(topping='peperoni') # wenn keine Größe angegeben wird, nimmt die Klasse aus dem Beispiel ja "normal"
order(ham, peperoni)
Schreib doch mal zur Übung den passenden Code dazu. :) Denkbar wäre ja vielleicht noch eine Fehlermeldung, wenn der Belag vergessen wurde.

EDIT: Wobei die Behandlung einer unbekannten Zahl an Argumenten für den Anfang vielleicht doch etwas viel ist. Zudem ist eigentlich gar keine Klasse nötig, wenn es wirklich nur um Größe und Belag geht. Da kann auch eine "normale" Funktion genommen werden, die dann der Funktion "order()" übergeben wird.
Zuletzt geändert von snafu am Sonntag 12. Oktober 2008, 11:30, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

snafu hat geschrieben:Es ist wesentlich lesbarer, wenn man nicht nach jedem Komma noch ein Leerzeichen setzt.
Gleichzeichen in Klammern würde ich ganz ohne Leerzeichen schreiben.
Nicht das Leerzeichen NACH dem Komma ist störend, sondern davor.
@rootmentor Arbeite mal die PEP8 durch. Im Wiki ist auch eine Übersetzung, falls dich das Englisch des Originals abhält. Ausserdem solltest du den Code auch durchlesen, der gepostet wird und dich zusätzlich fragen "Warum ist das so geschrieben?" und wenn du es nicht verstehst nachfragen. So hättest du jede Menge Fehler in deinem Schnipsel vermeiden können.

Idioms & Anti-Idioms aus den neuen 2.6er-Docs ist in dem Zug vielleicht auch keine schlechte Lektüre ;)
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

Is das nich egal wie ich meinen code gestalte?
Oder bekomm ich dann nachher probleme?

Also jetzt siehsts doch schon etwas schicker aus:

Code: Alles auswählen

#!/usr/bin/env python

class Pizza(object):
    def __init_(self , size = "small" , topping = None):
        self.size = "small"
        self.topping = None
        
        
    def order(self , size , belag):
        print "You choosed a" ,user_size,user_topping,"pizza"
        
            
            

topping_list = ("Ham , Peperoni , Tomato , Onion")

print "Welcome to Pizza.py you can choose from theese toppings"
print topping_list

user_size = raw_input("What size you want?")
user_topping = raw_input("What topping you want?")
while user_topping not in topping_list:
    user_topping = raw_input("What topping you want?")
    
p = Pizza()
p.order(user_size  ,  user_topping)


Man bin ich stolz auf mich xD
danke , Rootmentor
_____________________________________________
Die unendlichkeit dauert lang , besonders bis zum Ende
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ohne dir nahetreten zu wollen, aber bei deinem Verhalten bleibt einem eigentlich nur noch ein Kopfschütteln. Du scheinst dir nichts von dem anzunehmen, was man dir rät, sondern willst offenbar sowieso dein eigenes Ding machen. Du wurdest jetzt mehrmals auf die Fehler in deinem Code hingewiesen, nimmst aber weiterhin deine falsche Version als Grundlage für weitere Fehler. Ich für meinen Teil habe jetzt ehrlich gesagt keine Lust mehr, dir zu helfen.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

snafu hat geschrieben:Ich für meinen Teil habe jetzt ehrlich gesagt keine Lust mehr, dir zu helfen.
Das kann ich verstehen.
MfG
HWK
BlackJack

Me Too. Ist das Dummheit oder ein Troll?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich vermute einen relativ jungen Typen dahinter, dem das alles gerade ein bißchen zuviel Input ist. Da schaltet der Kopf schon mal ab und man probiert es mit der Brechstange.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Rootmentor hat geschrieben:Is das nich egal wie ich meinen code gestalte?
Oder bekomm ich dann nachher probleme?
Ja, dadurch dass du PEP8 ignorierst gibst du anderen das Signal dass du auf gutgemeinte, jahrelang erprobte Methoden pfeifst. Brauchst dich dann nicht wundern, dass die Leute eher seltener helfen wollen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Rootmentor hat geschrieben:Is das nich egal wie ich meinen code gestalte?
Oder bekomm ich dann nachher probleme?
Nur mit uns und anderen, die ihn lesen sollen (ohne ihre Lesegeschwindigkeit durch ungewöhnliche Formatierung verringern zu müssen) :)


Noch 'n Tipp zu Klassen: Wenn du darin Methoden hast, die in ihren Rümpfen nicht auf ``self`` zugreifen, dann sollten sie in den allermeisten Fällen auch nicht Teil der Klasse sein. Die Klasse ist nicht (wie bei PHP *hust*) als Namensraum gedacht, sondern für wirkliche objektorientierte Modellierung dessen, was du abbilden möchtest.
Rootmentor
User
Beiträge: 54
Registriert: Sonntag 17. August 2008, 18:26
Wohnort: Lingen
Kontaktdaten:

is das nich das was programmieren grad so einzigartig macht ich mein wenn alle mail programme alle betriebsysteme alle handy betriebssysteme gleich aussehen würden. Also ich fänds langweilig :D
_____________________________________________
Die unendlichkeit dauert lang , besonders bis zum Ende
Antworten