Was geht noch einfacher?

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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sonntag 10. Juni 2007, 07:22

gerold hat geschrieben:Man sollte None nicht mit ``==``, sondern mit ``is`` vergleichen. Warum -- weiß ich nicht mehr, denn es funktioniert in jedem Fall auch mit ``==``. Also steckt eher etwas Esoterisches dahinter. Unsere Sprachwissenschaftler können dir sicher genauer sagen, warum das so ist. :wink:
Ganz einfach: == kann man überladen, is nicht:

Code: Alles auswählen

>>> class Foo(object):
...  def __cmp__(self, other):
...   return 0
... 
>>> Foo() == None
True
Und ganz nebenbei ist "is" auch noch schneller, weil in jedem Fall die Speicheradressen verglichen werden.
TUFKAB – the user formerly known as blackbird
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Sonntag 10. Juni 2007, 07:24

@gerold

Das finde ich schön, dass du den Monolog unterbrichst. Danke für den Tipp, das werde ich dann gleich ausbessern, Demnächst werde ich mal die akutelle Fassung im Gesamten posten.

Übrigens: ich brauche vielleicht noch eine statische Methode. Weisst du mehr über statische Methoden ? (rhetorische Frage :D) Ich habe die eigentlich erst durch BJ Beispiel ziemlich am Anfang des Threads kennengelernt.
Wann sollte man sie auf keinen Fall implementieren usw. ?

LG

rolgal_reloaded
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 10. Juni 2007, 08:19

rolgal_reloaded hat geschrieben:Weisst du mehr über statische Methoden? [...] Wann sollte man sie auf keinen Fall implementieren usw.?
Hallo rolgal_reloaded!

Mit statischen Methoden kannst du zum Beispiel Funktionen, die irgendwie zusammen gehören, in einer Klasse zusammenfügen. Damit hast du dann mehrere allein stehende Funktionen, die eigentlich auch ohne die Klasse funktionieren würden, in einen Namensraum zusammen gefasst. Sozusagen als organisatorische Zusammenfassung. Diese statischen Funktionen können aufgerufen werden, ohne vorher eine Instanz einer Klasse zu erstellen. Es wird kein ``__init__()`` aufgerufen. ``self`` fällt weg, da es ja keinen Bezug zu einer Klasseninstanz gibt.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-


class TextTools(object):
    
    @staticmethod
    def center_block(text):
        max_lenght = max( len(line) for line in text.splitlines() )
        lines = []
        for line in text.splitlines():
            lines.append(line.center(max_lenght))
        return "\n".join(lines)
    
    
    @staticmethod
    def lower_first(word):
        word = word.title()
        word = word.swapcase()
        return word


def main():
    s = (
        "Das ist die perfekte Welle.\n"
        "Das ist der perfekte Tag.\n"
        "Wir sind gekommen um zu bleiben."
    )
    print TextTools.center_block(s)
    print
    print TextTools.lower_first("Hallo")


if __name__ == "__main__":
    main()
Der große Vorteil von Klassen ist ja der, dass man **Objekte** des täglichen Lebens abbilden kann. Daten und Methoden gehören zusammen. Methoden machen meist irgend etwas mit den Daten. Wenn eine Funktion nichts mit den Daten oder mit dem abgebildeten **Objekt** macht oder auch nicht auf diese Daten zugreift, dann ist es auch nicht zwingend erforderlich, diese Funktion an die Klasseninstanz zu binden. In diesem Fall könnte eine statische Methode sinnvoll sein. Statische Methoden sollten aber doch etwas mit der Klasse zu tun haben. Es macht keinen Sinn, die Funktion ``fahre_auto()`` in die Klasse ``Haus`` zu geben. Die Funktion ``baue_haus()`` würde aber zur Klasse ``Haus`` passen. Erst recht dann, wenn das Resultat der Funktion ``baue_haus()`` eine neue Instanz der Klasse ``Haus`` ist.

Besser kann ich es nicht erklären. Leider. :roll: Ich bin nicht so gut in so etwas.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Sonntag 10. Juni 2007, 10:08

Nun, da `None` ein Singleton ist, lohnt es nicht für den Vergleich die teurere `__eq__`-Maschinerie anzuwerfen. Der Vergleich mit `is` ist schneller und konzeptuell auch sinnvoller.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Sonntag 10. Juni 2007, 13:15

@gerold

Danke für die ausführliche Erklärung, auch wenn das meiste davon klar war, ist es gut auf den Punkt gebracht. Sowas schadet ja nicht.

Gibts diese statischen Methoden erst seit kurzem? Vor längerer Zeit habe ich mir nämlich mal erlaubt eine Klasse auch, genau wie du es genannt hast als organisatorische Zusammenfassung zu verwenden.
Bumm, da gabs nen Rüffel von einem unserer Meister hier - wer das wohl war, ggg.
Ich konnte seiner Argumentation auch folgen, aber der Tipp, es wenn dann mit statischen Methoden zu machen, wäre vielleicht auch nicht schlecht gewesen. Aber vielleicht gab sie sie auch nicht, deshalb die Frage nach dem "Alter" der statischen Methoden.

Bez der statischen Methdoden wollte ich vorher abklären, ob es besondere Aspekte zu berücksichtigen gibt. Dann spar ich mir das große Fragen "Warum funktioniert das nicht....." und euch das große Antworten.

Ganz konkret: Wenn load() in meinem DataBook eine statische Methode ist, dann wäre es ja wohl nicht so verkehrt save() auch zu einer solchen zu machen, oder?

Code: Alles auswählen

    @staticmethod
    def load(path):
        my_file = file(path, "rb")
        entries = pickle.load(my_file)
        my_file.close()
        return entries

    @staticmethod
    def save(path):
        my_file = file(path, "wb")
        pickle.dump(my_file)
        my_file.close()  
LG

rolgal_reloaded

P.S:
Besser kann ich es nicht erklären. Leider. Rolling Eyes Ich bin nicht so gut in so etwas.
Da schätzt du dich falsch ein, würde ich mal sagen :D
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Sonntag 10. Juni 2007, 13:17

@blackbird, birkenfeld,

Danke! Schön, dass auch ihr die Auferstehung dieses Threads mitfeiert....

Im Ernst: Die Antworten haben mir was gebracht :D

LG

rolgal_reloaded
BlackJack

Sonntag 10. Juni 2007, 17:27

Statische Methoden sollte man nicht verwenden, wenn man eigentlich nur Funktionen in einer Klasse zusammenfasst. Dazu sind Module da.

Ich persönliche verwende statische Methoden und Klassenmethoden eigentlich nur für alternative Wege, Objekte von der entsprechenden Klasse zu erstellen. Also für `load()` oder `from_json()` und ähnliches.

Warum `save()` keine statische Methode sein sollte, fällt Dir vielleicht selber auf, wenn Du aus Deinem Schnippsel eine lauffähige Variante machst. Da fehlt nämlich noch *was* gespeichert werden soll. :-)
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Sonntag 10. Juni 2007, 17:44

BlackJack hat geschrieben:
Warum `save()` keine statische Methode sein sollte, fällt Dir vielleicht selber auf, wenn Du aus Deinem Schnippsel eine lauffähige Variante machst. Da fehlt nämlich noch *was* gespeichert werden soll. :-)
Ja, weil zum speichern sowieso eine Instanz notwendig ist, dann kann man sich die statische Methode sparen. Es schien zunächst, kurzsichtig wie ich nunmal bin :shock: 8) konsequenter load() und save() als statische Methoden zu definieren.

LG

rolgal_reloaded
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 10. Juni 2007, 17:55

rolgal_reloaded hat geschrieben:

Code: Alles auswählen

    @staticmethod
    def load(path):
        my_file = file(path, "rb")
        entries = pickle.load(my_file)
        my_file.close()
        return entries

    @staticmethod
    def save(path):
        my_file = file(path, "wb")
        pickle.dump(my_file)
        my_file.close()  
Hallo rolgal_reloaded!

Die statische Methode ``load`` macht nichts mit den Daten der Klasseninstanz. Es wird weder etwas aus der Instanz ausgelesen, noch wird etwas rein geschrieben. --> "Statische Methode" sinnvoll.

Die Methode ``save`` braucht aber irgendwo her die Daten, die gepickelt werden sollen, und diese Daten sind die Klasseninstanz selbst. Auch wenn du es in deiner Funktion vergessen hast, aber ``pickle.dump`` wird so ohne Daten nicht funktionieren. ``save`` braucht die Instanz um arbeiten zu können. --> "Normale Methode".

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 10. Juni 2007, 18:10

BlackJack hat geschrieben:Statische Methoden sollte man nicht verwenden, wenn man eigentlich nur Funktionen in einer Klasse zusammenfasst. Dazu sind Module da.
Hallo BlackJack!

Natürlich sind dazu Module da. Aber wer schreibt mir vor, dass ich meine vier/fünf Funktionen, die in keinem anderen Programm Verwendung finden, in ein Modul verlegen soll. Das macht die Sache komplizierter als sie sein muss. Ab damit in eine Klasse und schon ist Ordnung im Programm.

Außerdem vereinfacht das auch die Programmierung mit einer IDE mit Codevervollständigung. So muss man sich nicht merken wie die Funktion heißt. Man muss sich *nur* merken wie der Container heißt, denn spätestens beim Eintippen des Punktes "." werden diese Funktionen aufgelistet.

Man muss sich immer auch überlegen, wem man damit Gutes tut. Wer produktiv mit einer IDE programmiert, der lernt solche Hilfsmittel ziemlich schnell zu schätzen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten