Seite 1 von 1

Klassenattribute mittels Punktoperator erreichen

Verfasst: Donnerstag 3. Februar 2011, 15:14
von sprudel
Hallo,

wie kann ich eine spezielle Methode einbauen, um die Klassenmethode mittels des Punktoperators zu erreichen?
Beispiel:

class Person(object):
a = 100
b = 150
c = "abc"
obj = Person()


und nun z.B. natürlich mal

obj.a

aber auch z.B.
print obj.total (was a und b zusammenrechnen würde)
oder
obj.a = "100" was automatisch dann konvertieren würde.

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Donnerstag 3. Februar 2011, 15:20
von BlackJack
@sprudel: Das geht mit `property()`. Aber es sieht sehr komisch aus was Du da machen willst. Und Du nennst Attribute die keine Methoden sind, Methoden!?

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Donnerstag 3. Februar 2011, 15:24
von problembär
@sprudel: Du hast schon gemerkt, daß Einrückungen in Python von Bedeutung sind, oder? Wie kannst Du dann hier sowas posten? Bitte benutze den \

Code: Alles auswählen

-Tag.

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Donnerstag 3. Februar 2011, 15:25
von sprudel
@Blackjack: War ein blödes Beispiel. Aber wie verwende ich property am elegantesten und "pythontypischsten" ?

@problembär: Das war jetzt nur ein schnelles Beispiel vom Mobiltelefon. ich mache zuhause die Tags dazu, aber das ist hier so ungeschickt.

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Donnerstag 3. Februar 2011, 15:27
von BlackJack
@sprudel: Wenn das Beispiel blöd war, dann beschreib doch mal was Du *wirklich* machen willst.

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Donnerstag 3. Februar 2011, 19:26
von anogayales
[quote="problembär"]@sprudel: Du hast schon gemerkt, daß Einrückungen in Python von Bedeutung sind, oder? Wie kannst Du dann hier sowas posten? Bitte benutze den \

Code: Alles auswählen

-Tag.[/quote]
Und wenn es python code ist kann man auch python tags benutzen 

Grüße,
anogayales

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Freitag 4. Februar 2011, 12:32
von Darii
sprudel hat geschrieben:wie kann ich eine spezielle Methode einbauen, um die Klassenmethode mittels des Punktoperators zu erreichen?
Wenn, dann heißt das Methode. Klassenmethoden sind Methoden die auf Klassen operieren und nicht auf Instanzen (ist in Python durch classmethod oder Metaklassen zu realisieren).

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Freitag 4. Februar 2011, 18:07
von problembär
Ich sehe Dein Problem nicht. Warum nicht einfach (ganz normal) so:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

class Person:

    def __init__(self):
        self.a = 100
        self.b = 150
        self.c = "abc"
        self.total = 0

    def calcTotal(self):
        self.total = self.a + self.b

obj = Person()
print obj.a
print obj.b
print obj.c
obj.calcTotal()
print obj.total
obj.a = "100"
print type(obj.a)
?

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Freitag 4. Februar 2011, 18:10
von Xynon1
Ich würde das dann aber eher so machen, wie BlackJack das empfohlen hatte, wenn ich mich nicht täusche.

Code: Alles auswählen

class Person(object):

    def __init__(self):
        self.a = 100
        self.b = 150
        self.c = "abc"

    @property
    def total(self):
        return self.a + self.b

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Freitag 4. Februar 2011, 20:26
von syntor
problembär hat geschrieben:Ich sehe Dein Problem nicht. Warum nicht einfach (ganz normal) so:

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

class Person:

    def __init__(self):
        self.a = 100
        self.b = 150
        self.c = "abc"
        self.total = 0

    def calcTotal(self):
        self.total = self.a + self.b

obj = Person()
print obj.a
print obj.b
print obj.c
obj.calcTotal()
print obj.total
obj.a = "100"
print type(obj.a)
?
Weil das zu einer Inkonistenz führt, sobald du a oder b veränderst. Besser wäre es, wenn du den Wert zurückgeben würdest, und ihn nicht als Attribut ablegen würdest.

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Freitag 4. Februar 2011, 22:25
von problembär
syntor hat geschrieben:Weil das zu einer Inkonistenz führt, sobald du a oder b veränderst.
Seh' ich nicht. Könntest Du das bitte genauer erklären? So läuft doch alles ...

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Freitag 4. Februar 2011, 22:41
von syntor

Code: Alles auswählen

>>> p = Person()
>>> p.total == p.a + p.b
False
>>> p.calcTotal()
>>> p.total == p.a + p.b
True
>>> p.a += 1
>>> p.total == p.a + p.b
False
total müsste meiner Ansicht nach immer gleich a + b sein, sonst sind die Daten u.U. inkonsistent.

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Freitag 4. Februar 2011, 22:55
von problembär
syntor hat geschrieben:

Code: Alles auswählen

>>> p = Person()
>>> p.total == p.a + p.b
False
>>> p.calcTotal()
>>> p.total == p.a + p.b
True
>>> p.a += 1
>>> p.total == p.a + p.b
False
total müsste meiner Ansicht nach immer gleich a + b sein, sonst sind die Daten u.U. inkonsistent.
Hmm, das macht mich nachdenklich.
Würde es was helfen, wenn

Code: Alles auswählen

self.total = self.a + self.b
schon in "def __init__()" gesetzt würde?
Ist aber sicher nicht gut, wenn man p.a von außen in einen String umwandelt, und dann p.total durcheinanderkommt, weil es eine Summe von Integern sein soll. Meinst Du das?

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Freitag 4. Februar 2011, 23:04
von cofi
Nein, es wuerde nicht helfen, da die Daten immernoch bei Aenderungen von `.a` und `.b` inkonsistent werden. Das Problem ist, dass `total` 2(bzw 3)-schrittig aktualisiert werden muss. Die einzige Alternative waere `.total` fallenzulassen und stattdessen bei `calcTotal` zurueckzugeben.

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Samstag 5. Februar 2011, 16:09
von problembär
cofi hat geschrieben:Die einzige Alternative waere `.total` fallenzulassen und stattdessen bei `calcTotal` zurueckzugeben.
Das wäre wahrscheinlich am besten.

Re: Klassenattribute mittels Punktoperator erreichen

Verfasst: Samstag 5. Februar 2011, 21:09
von Leonidas
Also ich finde ja schon dass ``total`` hübsch als Property ist. Sofern es keine Seiteneffekte hat und nicht so PEP8-inkonform wie ``calcTotal`` (was übrigens auch generell kein guter Name ist) benannt ist. Aber das sollte man eben abwiegen. Wenn die berechnung "nahezu" Trivial ist, ist ein Proprty gut, aber wenn die Berechnung jetzt lange blokieren könnte (wegen was auch immer), dann wäre eine Methode ggf. klarer, da der Programmierer weiß das dabei "einiges passiert".