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.
LG Dexter
Erklärungen, Definitionen, Informatik...
@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.
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.
-
- 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?
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.
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.Dexter1997 hat geschrieben:kann mir jemand sagen wo der fehler ist?
-
- User
- Beiträge: 92
- Registriert: Sonntag 2. Dezember 2012, 21:13
alles klar, dann wurden alle fragen geklärt.
Dann gibt es jetzt ohne Frage deinerseits noch etwas Ergänzendes.Dexter1997 hat geschrieben:alles klar, dann wurden alle fragen geklärt.
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.
@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:
mutetella
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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
-
- 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
@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‽
-
- 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
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
@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.
-
- 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?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.Dexter1997 hat geschrieben:aber in meinem Buch lernt man nur den Umgang mit klassischen Klassen, das ist das blöde, verstehst du?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Die new-style classes gibt es jetzt seit über 11 Jahren in Python. Entweder hast du ein sehr altes oder ein sehr schlechtes Lehrbuch.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?
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.