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

Beitragvon cofi » Donnerstag 9. Oktober 2008, 21:40

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: 5424
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Freitag 10. Oktober 2008, 10:13

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:

Beitragvon Rootmentor » Samstag 11. Oktober 2008, 09:32

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

Beitragvon cofi » Samstag 11. Oktober 2008, 10:18

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: 5424
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Samstag 11. Oktober 2008, 12:02

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:

Beitragvon Rootmentor » Samstag 11. Oktober 2008, 12:22

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: 5424
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Samstag 11. Oktober 2008, 12:36

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:

Beitragvon Rootmentor » Samstag 11. Oktober 2008, 12:38

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:

wow x)

Beitragvon Rootmentor » Sonntag 12. Oktober 2008, 09:18

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

Beitragvon BlackJack » Sonntag 12. Oktober 2008, 09:48

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: 5424
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Re: wow x)

Beitragvon snafu » Sonntag 12. Oktober 2008, 10:23

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

Re: wow x)

Beitragvon cofi » Sonntag 12. Oktober 2008, 11:16

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:

Beitragvon Rootmentor » Sonntag 12. Oktober 2008, 12:59

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: 5424
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Sonntag 12. Oktober 2008, 13:18

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

Beitragvon HWK » Sonntag 12. Oktober 2008, 13:45

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

Wer ist online?

Mitglieder in diesem Forum: Kniffte, pixewakb