OOP für Dummy's

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

sea-live hat geschrieben:Ein Buch(Programm) ist nur so gut wie der Autor(Programmierer)

und selbst BlackJack lernt immer noch was dazu (denk ich jedenfals)

es gibt immer einer der es besser weis
und hinterher ist man sowieso schlauer

ALBERT EINSTEIN
Holzhauen ist so beliebt weil man das ergebniss gleich sieht!
Wenn man die Wahl zwischen Scheiße und Gold hat...

Man muss nicht unbedingt ein Buch durcharbeiten, nur um zu wissen, wie man es nicht macht.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Danke BlackJack!
Für diese ausführliche und konkrete Bewertung, die für mich einige Denkanstöße, neue Erkenntnisse und auch Fragen mit sich bringt.

Ich fang mal an damit:

Die Bezeichnung von __init__() als Konstruktor oder auch Konstrukturmethode (was ich irgendwo anders als Bezeichnung gelesen habe) finde ich - auch wenn sie nach deiner Aussage "technisch falsch" ist - nicht schlecht, weil es von der Sache her doch den Punkt trifft und beim Verständnis für jemanden, der von einer anderen OOP Sprache kommt, hilfreich ist. Eine Methode namens __new__() habe ich bisher noch nirgends zu Gesicht bekommen.

Warum soll, "wer Zugriffsschutz mag nicht in Python programmieren"???
Es ist doch grundsätzlich sehr vernünftig, wenn man auf (Daten-)Attribute nicht direkt, sondern nur über Methoden (getter/setter) zugreift - zumindest für den schreibenden Zugriff.
Bis eben war ich davon ausgegangen, dass die Einführung der property() Funktion genau diesem Zweck (= Zugriffsschutz) dient, allerdings mit dem Vorteil für den Nutzer der Klasse, dass er für den Zugriff auf die (Daten-)Attribute die Getter-/Setter nicht selbst explizit aufzurufen braucht, sondern (scheinbar) direkt auf die Attribute zugreifen kann.

In einem Satz unterscheidest du statische Methoden und Klassenmethoden. Für mich war das immer ein und dasselbe. Erklärung wäre nett.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Hyperlinks zu besseren Docus
sind Hier erwünscht und das Ziel dieses Threades

Mein Gedrucktes stammt aus 1994 Kompendium C 2500Seiten

ich wolte ja in C dann hat jemand gemailt mach SCHLANGE statt 3seiten C 3Zeilen

Code: Alles auswählen

import urllib
url=("http://ichart.yahoo.com/table.csv?s=%s&a=%s&b=%s&c=%s&d=%s&e=%s&f=%s&g=d&ignore=.csv" %(symbol_liste[x],Monatvon,Tagvon,Jahrvon,Monatbis,Tagbis,Jahrbis))
           
            req = urllib.urlopen(url)

           
deswegen bin ich hier gelandet

dann sagte jemand nimm Tkinter tolle oberfläche GUI
dann mit Chart_zeichner nimm wxPython

usw
ergebniss
Bild
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Ich will dir jetzt wirklich nicht zu nahe treten: Ist Deutsch deine Muttersprache oder bist du noch am Lernen?
Mir fällt es ernsthaft schwer, den Sinn deiner Sättze zu erraten.
BlackJack

@pütone: `__new__` braucht man, wenn man den "echten" Konstruktor von "immutable"s überschreiben möchte. Völlig sinnloses Beispiel:

Code: Alles auswählen

def MyInt(int):
    def __init__(self, value):
        int.__init__(self, 2 * value) # Geht nicht!
Zu dem Zeitpunkt wo die `__init__()` aufgerufen wird, existiert das Objekt schon und man kann den Wert nicht mehr ändern. Dafür muss man `__new__()` überschreiben. Und das ist ein echter Konstruktor in dem Sinne, das man dort wirklich ein Objekt erzeugen kann und zurückgeben muss.

Andere Einsatzzwecke sind "Singletons", oder das "Flyweight"-Entwurfsmuster.

Properties sind dazu da um aus einfachen Attributen noch nachträglich "berechnete Attribute" machen zu können, ohne das sich die API ändert. Dieses Bankkonto-Beispiel ist IMHO irreführend, weil damit suggeriert wird, dass man natürlich nicht möchte, dass jemand von aussen den Kontostand ändern kann. Nur das man in einem Programm, das diese Objekte verwendet, ja gar nicht von aussen kommt! Die Kapselung ist nicht zum Schutz der Daten da, sondern um Flexibilität bei der Implementierung der Interna zu waren. Wenn der Räuber Hotzenplotz aus dem Buch in der Lage ist beliebige Konto-Objekte zu erstellen, dann ist aus Sicherheitsaspekten eh alles zu spät. Dann kann er sich auch ein neues Konto erzeugen und alles von den anderen dorthin überweisen, auch wenn er keinen direkten Zugriff auf das Attribut `__Kontostand` hat.

Ein Unterstrich in `_kontostand` sollte reichen, damit keiner auf die Idee kommt von aussen direkt darauf zuzugreifen, ohne zu wissen was er da tut.

Statische Methoden sind vom Verhalten her einfach nur Funktionen, die im Namensraum einer Klasse stecken. Klassenmethoden bekommen als erstes Argument automatisch die Klasse als Argument auf der sie aufgerufen werden. Also ein ähnlich "magisches" Argument wie `self` bei normalen Methoden. Beispiel:

Code: Alles auswählen

class A(object):
    def __init__(self, arg):
        print 'init A', arg
    
    @classmethod
    def blub(cls, arg):
        return cls(arg)


class B(A):
    def __init__(self, arg):
        print 'init B', arg
        A.__init__(self, arg)


def main():
    x = B.blub(42)
    print type(x)
pot
User
Beiträge: 55
Registriert: Sonntag 4. März 2007, 00:57
Wohnort: Frauenfeld, CH

Danke BlackJack für die ausführliche Erklärung. Jetzt weiss ich, wo ich mein Wissen sicherlich nicht erweitern werde: bei diesem Buch :lol:

Eigentlich wollte ich nicht so drastisch vom Thema abkommen, Entschuldigung dafür.

Grüsse
Pot
Antworten