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 \
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
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".