Property, Setter, Getter

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
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16: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

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)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

Danke
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Antworten