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.
Klassenattribute mittels Punktoperator erreichen
@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!?
@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.
@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.
@problembär: Das war jetzt nur ein schnelles Beispiel vom Mobiltelefon. ich mache zuhause die Tags dazu, aber das ist hier so ungeschickt.
@sprudel: Wenn das Beispiel blöd war, dann beschreib doch mal was Du *wirklich* machen willst.
-
- 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
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).sprudel hat geschrieben:wie kann ich eine spezielle Methode einbauen, um die Klassenmethode mittels des Punktoperators zu erreichen?
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)
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
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 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)
Seh' ich nicht. Könntest Du das bitte genauer erklären? So läuft doch alles ...syntor hat geschrieben:Weil das zu einer Inkonistenz führt, sobald du a oder b veränderst.
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
Hmm, das macht mich nachdenklich.syntor hat geschrieben:total müsste meiner Ansicht nach immer gleich a + b sein, sonst sind die Daten u.U. inkonsistent.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
Würde es was helfen, wenn
Code: Alles auswählen
self.total = self.a + self.b
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?
- 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.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Das wäre wahrscheinlich am besten.cofi hat geschrieben:Die einzige Alternative waere `.total` fallenzulassen und stattdessen bei `calcTotal` zurueckzugeben.
-
- 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