Erklärungen, Definitionen, Informatik...

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
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Es geht um Objekte
Um zu meiner Frage zu kommen, muss ich einen kleinen Buchausschnitt zitieren. Meine Fragen schreibe ich in Klammern in das Zitat:
"Wir sahen bereits die __init__()-Methode (__init__() ist eine Methode? ist es nicht eher eine eingebaute Funktion von Python? denn ich habe gelernt das Methoden die Aktionen(z.b. was man mit dem objekt tun kann) eines Objekts darstellen, __init__() hingegen definiert nur vorab die Eigenschaften der Instanzen die man erstellt, oder nicht?) am Werk, die ein Objekt initialisiert, wenn es neu angelegt wird. Jedes Objekt hat eine eingebaute __init__() Methode (Was ist und wie funktioniert diese -eingebaute- __init__() Methode? Ich kann mir darunter nichts konkretes vorstellen.) Wenn du keine eigene Methode dafür in deine Klassendefinition schreibst, übernimmt diese eingebaute Methode den Job und erstellt das Objekt." (Und wie kann man sich das vorstellen? Welche Mechaniken passieren da? Ich kann mir da auch kein klares Bild machen.)
Ist eine Instanz das eigentliche Objekt oder sind es die Klassen und die daraus entstehenden Instanzen als ganzes?
Wäre schön wenn ihr mich aufklären könnt, warum man __init__ eine Spezialmethode und nicht Funktion nennt, und die weiteren Fragen. :D

LG Dexter
BlackJack

@Dexter1997: `__init__()` ist eine Methode. Methoden werden auf Objekten aufgerufen und das Objekt auf dem sie aufgerufen werden, wird als erstes Argument übergeben. Das trifft auf `__init__()` alles zu. Wieso denkst Du das initialisieren eines Objektes wäre keine Aktion auf diesem Objekt?

Wenn man auf einer Klasse keine eigene `__init__()`-Methode definiert, dann wird die von der Basisklasse verwendet. Bei „old style”-Klassen in Python 2 gibt es keine, aber die sollte man nicht mehr verwenden und explizit von `object` erben. Bei Python 3 passiert das erben von `object` implizit.

Der Mechanismus ist ganz normale Vererbung. Wenn man eine Methode aufruft die es in der Klasse nicht gibt, wird in der Vererbungshierarchie danach gesucht. Da passiert bei `__init__()` nichts anderes oder besonderes was nicht bei jeder anderen Methode auch passiert.

Der Text ist in sofern falsch als das `__init__()` das Objekt nicht erstellt, sondern nur ein bereits vorhandenes initialisiert. Der Konstruktor heisst in Python `__new__()` und da wird ein Objekt tatsächlich erstellt.

Instanz ist eigentlich eine falsche Übersetzung vom englischen „instance”. Auf deutsch heisst das eigentlich „Exemplar” oder etwas mathematischer „Ausprägung (einer Klasse)”. Diese Begriffe beziehen sich auf ein konkretes Objekt, das eine Klasse als Vorlage hat.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Vielen Dank, du hast mir in der Theorie ein wenig mehr Verständnis gegeben.
Und du hast recht, init ist eine Methode, ich hatte nur ein leicht falsches Bild von Methoden.

eine frage noch zu meinem code:
Wenn die Methode faerben(self) aufgerufen wird, und die Hautfarben weiß ist, wird sie nicht auf schwarz geändert obwohl ich dachte ich hätte das einprogrammiert, kann mir jemand sagen wo der fehler ist?

Code: Alles auswählen

class Mensch:

    def __init__(self, Name, Sprache, Land, Hautfarbe):
        self.Name = Name
        self.Sprache = Sprache
        self.Land = Land
        self.Hautfarbe = Hautfarbe

    def __str__(self):
        nachricht = "Name: " + self.Name + "\nSprache: " + self.Sprache + "\nLand: " + self.Land + " \nHautfarbe: " + self.Hautfarbe
        return nachricht

    def faerben(self):
        if self.Hautfarbe == "weiss":
            self.Hautfarbe == "schwarz"
        elif Hautfarbe == "schwarz":
            self.Hautfarbe == "weiss"
        print self.Hautfarbe
            
Henry = Mensch("Henry", "Deutsch", "Deutschland", "weiss")

print Henry

eingabe = raw_input ("\nMoechtest du die Hautfarbe von Henry aendern?")
if eingabe == "ja":
    Henry.faerben()
else:
    print "Okay dann nicht."
    
raw_input ()
Zuletzt geändert von Dexter1997 am Montag 17. Dezember 2012, 21:45, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dexter1997 hat geschrieben:kann mir jemand sagen wo der fehler ist?
Du hast in der Methode faerben() ein "self." vergessen. Außerdem sind die vermeintlichen Zuweisungen keine, da du ein doppeltes Gleichheitszeichen verwendest und damit einen Vergleich machst statt der geplanten Zuweisung.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du möchtest eine Zuweisung machen und keine Vergleiche.
Das Leben ist wie ein Tennisball.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

alles klar, dann wurden alle fragen geklärt.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dexter1997 hat geschrieben:alles klar, dann wurden alle fragen geklärt.
Dann gibt es jetzt ohne Frage deinerseits noch etwas Ergänzendes.

Du arbeitest offensichtlich mit Python 2.x. Dort solltest du dir angewöhnen alle Klassen, sofern du sie nicht von einer anderen Klasse ableitest, von object erben zu lassen. Du erhältst damit so genannte new-style classes die etwas mehr können als classic classes und sich an manchen Stellen anders verhalten. Da Python 3 nur noch new-style classes kennt sollte man alleine im Interesse der Zukunftssicherheit keine classic classes mehr verwenden.

Bei der Namensgebung solltest du dich direkt am Style Guide für Python Code orientieren um das direkt von Anfang an präsent zu haben. Danach sollten Methodennamen und Bezeichner in Kleinbuchstaben (mit Unterstrich als Worttrenner) geschrieben werden. Die Verwendung des Style Guide erleichtert es anderen deine Programme zu lesen und umgekehrt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Dexter1997
Dass Deine '__str__'-Methode einen String mit Zeilenumbrüchen ausgibt würde ich so nicht erwarten.
Wenn Du eine formatierte Ausgabe Deiner Attribute möchtest, würde ich das mindestens über '__format__' machen:

Code: Alles auswählen

class Human(object):
    def __init__(self, name, language, country, colour):
        self.name = name
        self.language = language
        self.country = country
        self.colour = colour

    def __format__(self, layout):
        values = dict(self.__dict__)
        values['cr'] = ''
        values['tab'] = ''
        if layout == 'block':
            values['cr'] = '\n'
            values['tab'] = '\t'
        return ('Name: {tab}{tab}{name} {cr}'
                'Language: {tab}{language} {cr}'
                'Country: {tab}{country} {cr}'
                'Colour: {tab}{colour}').format(**values)

>>> me = Human('mutetella', 'german', 'bavaria', 'cheesewhite')
>>> print '{0}'.format(me)
Name: mutetella Language: german Country: bavaria Colour: cheesewhite
>>> print '{0:block}'.format(me)
Name:       mutetella 
Language:   german 
Country:    bavaria 
Colour:     cheesewhite
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Vielen Dank für die zusätzlichen Informationen! Auch wenn ich es ein bisschen schade finde, dass die "classic classes" mehr und mehr an popularität verlieren
BlackJack

@Dexter1997: Diese Aussage ist genau so schwachsinnig wie die das Python 3 „cooler” aussieht. Woran misst Du denn bitte die „Popularität” von einer Spracheigenschaft, die seit nun schon über 10 Jahren durch das neue Klassenmodell abgelöst wurde‽
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Hallo BlackJack, das ist doch offensichtlich. Ich verstehe unter populär etwas, was gängig und bekannt ist. Wenn ein... (ich nenn es mal) "Feature" in einen Programm in neueren Versionen nicht mehr vorhanden ist, verliert es somit an Popularität, da es ja für neuere Versionen nicht mehr relevant ist, und deswegen nurnoch in älteren Versionen verwendet wird (welche logischerweise veralten).

Achso, wegen Python 3.0 sieht "cooler" aus: Damit mein ich das aussehen des Codes:
soweit ich weiß werden z.b print anweisungen in Klammern geschrieben: print ("Bla").
Ich finde einfach dass das besser aussieht als print "Bla"

Ich kann allerdings jetzt mit meinem wenigen Wissen auch kein Gelehrtenstreit mit dir führen;)
und habe auch keine lust dazu
BlackJack

@Dexter1997: Gängig und bekannt sind „new style”-Klassen. Gängig und bekannt ist aber auch nicht die Definition von populär. Was ist denn nun so schade daran, dass „classic classes” nicht mehr verwendet werden? Hast Du überhaupt eine Ahnung worum es bei der Änderung des Klassenmodells ging? Die beiden Beiträge machen eher den Eindruck als wenn Du irgendwas schreiben wolltest einfach um irgendwas zu schreiben. Ohne Sinn und Aussage.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Schöner Eindruck, aber in meinem Buch lernt man nur den Umgang mit klassischen Klassen, das ist das blöde, verstehst du? Wars das jetzt oder muss ich mich nochmal für irgendeine "schwachsinnige" Aussage rechtfertigen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dexter1997 hat geschrieben:aber in meinem Buch lernt man nur den Umgang mit klassischen Klassen, das ist das blöde, verstehst du?
Dann musst du aber nicht schade finden dass die obsolete classes (was ein besserer Begriff ist, wenn man die schon irgendwie benennen will) nicht mehr verwendet werden sondern ein neues Buch finden oder einfach ohne Buch die new-style-classes nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dexter1997 hat geschrieben:Schöner Eindruck, aber in meinem Buch lernt man nur den Umgang mit klassischen Klassen, das ist das blöde, verstehst du?
Die new-style classes gibt es jetzt seit über 11 Jahren in Python. Entweder hast du ein sehr altes oder ein sehr schlechtes Lehrbuch.

Unabhängig davon solltest du einfach trotzdem mit den neuen Klassen arbeiten. Es bringt dir keine Vorteile, wenn du veraltete und technisch überholte Dinge verwendest.
Antworten