Seite 1 von 1

Property, Setter, Getter

Verfasst: Sonntag 18. Oktober 2020, 19:42
von naheliegend
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

Re: Property, Setter, Getter

Verfasst: Sonntag 18. Oktober 2020, 19:53
von Sirius3
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)

Re: Property, Setter, Getter

Verfasst: Sonntag 18. Oktober 2020, 20:22
von snafu
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.

Re: Property, Setter, Getter

Verfasst: Sonntag 18. Oktober 2020, 20:43
von naheliegend
Danke

Re: Property, Setter, Getter

Verfasst: Montag 19. Oktober 2020, 01:31
von pillmuncher
@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

Re: Property, Setter, Getter

Verfasst: Montag 19. Oktober 2020, 08:28
von snafu
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...