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.
naheliegend
User
Beiträge: 439 Registriert: Mittwoch 8. August 2018, 16:42
Sonntag 18. Oktober 2020, 19:42
Hi,
was benutzt man eher? Also was ist "pythontypischer"?
Code: Alles auswählen
class Mensch:
def __init__(self, vorname, nachname):
self.Vorname = vorname
self.Nachname = nachname
self._Name = self.Vorname + ' ' + self.Nachname
@property
def Name(self):
return self._Name
@Name.setter
def Name(self, neuerName):
self._Name = neuerName
def main():
Ich = Mensch('Siggi', 'Freud')
print(Ich.Name)
Ich.Name = 'Alfredo Adler'
print(Ich.Name)
oder
Code: Alles auswählen
class Mensch:
def __init__(self, vorname, nachname):
self.Vorname = vorname
self.Nachname = nachname
self._Name = self.Vorname + ' ' + self.Nachname
def get_Name(self):
return self._Name
def set_Name(self, neuerName):
self._Name = neuerName
Name = property(get_Name, set_Name)
def main():
Ich = Mensch('Siggi', 'Freud')
print(Ich.Name)
Ich.Name = 'Alfredo Adler'
print(Ich.Name)
Output:
Code: Alles auswählen
Siggi Freud
Alfredo Adler
Process finished with exit code 0
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Sirius3
User
Beiträge: 17750 Registriert: Sonntag 21. Oktober 2012, 17:20
Sonntag 18. Oktober 2020, 19:53
Attribute werden wie Variablennamen komplett klein geschrieben.
Strings setzt man nicht mit + zusammen, sondern benutzt Formatstrings.
Daher so:
Code: Alles auswählen
class Mensch:
def __init__(self, vorname, nachname):
self.vorname = vorname
self.nachname = nachname
self._name = f"{vorname} {nachname}"
@property
def name(self):
return self._name
@name.setter
def name(self, neuer_name):
self._name = neuer_name
def main():
ich = Mensch('Siggi', 'Freud')
print(ich.name)
ich.name = 'Alfredo Adler'
print(ich.name)
snafu
User
Beiträge: 6740 Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen
Sonntag 18. Oktober 2020, 20:22
Wobei dieses Beispiel den selben Effekt hat wie ein direktes Setzen und Lesen des Attributs. Diese Art von trivialen Getter- und Setter-Methoden ist in Python unüblich. Wie gesagt: Einfach das betreffende Attribut als Teil der öffentlichen Schnittstelle sehen. Nur wenn da intern tatsächlich mehr passiert als der reine Attributszugriff, dann würde man eine Methode dafür bauen.
naheliegend
User
Beiträge: 439 Registriert: Mittwoch 8. August 2018, 16:42
Sonntag 18. Oktober 2020, 20:43
Danke
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
pillmuncher
User
Beiträge: 1484 Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel
Montag 19. Oktober 2020, 01:31
@naheliegend: Dein Klasse führt zu inkonsistenten Daten:
Code: Alles auswählen
def main():
Ich = Mensch('Siggi', 'Freud')
print('Vorname:', Ich.Vorname, 'Nachname:', Ich.Nachname, 'Vollständiger Name:', Ich.Name)
Ich.Name = 'Alfredo Adler'
print('Vorname:', Ich.Vorname, 'Nachname:', Ich.Nachname, 'Vollständiger Name:', Ich.Name)
Ergebnis:
Code: Alles auswählen
Vorname: Siggi Nachname: Freud Vollständiger Name: Siggi Freud
Vorname: Siggi Nachname: Freud Vollständiger Name: Alfredo Adler
In specifications, Murphy's Law supersedes Ohm's.
snafu
User
Beiträge: 6740 Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen
Montag 19. Oktober 2020, 08:28
Und das sind eben die Probleme, die man sich einhandelt, wenn Klassen "zu schlau" sein sollen. Den vollständigen Namen würde ich höchstens in der __str__()-Methode ermitteln lassen. Ansonsten ist das als Beispiel vielleicht erstmal ganz nett, aber in der Praxis eben auch anfällig für viel Boilerplate-Code. Muss aber im Einzelfall jeder selber wissen, wie feingradig das Objekt später agieren soll...