Klassenattribute mittels Punktoperator erreichen

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
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

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.
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!?
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.
sprudel
User
Beiträge: 250
Registriert: Donnerstag 8. März 2007, 17:12

@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.
BlackJack

@sprudel: Wenn das Beispiel blöd war, dann beschreib doch mal was Du *wirklich* machen willst.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

[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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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).
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)
?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

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.
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 ...
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

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.
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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
problembär

cofi hat geschrieben:Die einzige Alternative waere `.total` fallenzulassen und stattdessen bei `calcTotal` zurueckzugeben.
Das wäre wahrscheinlich am besten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten