Klassenattribut als Methodenaufruf
Verfasst: Mittwoch 3. Juni 2009, 14:40
Hi,
ich habe folgenden Pseudocode für eine Klasse:
In anderen Worten, ich möchte für's Setzen und Abfragen des Attributs `say` eine Klassenmethode - hier: `say()` - aufrufen. Da die gleichen Namen wohl kollidieren, von mir aus auch `say_something()`.
Um das Ganze mal konkreter zu zeigen:
...funktioniert wie gewünscht. Aber sobald ich einen neuen Wert für das Attribut setze, geht die Funktionalität verloren:
Kann mir vielleicht hier jemand die Hintergründe erklären und einen besseren Weg zeigen?
Mein Ansatz ist bisher dieser:
Wenn ich jetzt aber den Wert für ein anderes Attribut neu setzen will (z.B. `foo.ham = 'spam'`), führt dies zu einer endlosen Rekursion. Mir ist nicht ganz klar, warum das Verhalten bei `__setattr__()` und `__getattr__()` so verschieden ist. Und ich hätte gerne erst das geklärt, bevor ich mich an den Methodenaufruf wage.
EDIT: Die zweite Methode lässt sich natürlich einfacher ausdrücken mit `if not attr == 'bar':`.
ich habe folgenden Pseudocode für eine Klasse:
Code: Alles auswählen
class Foo(object):
def __init__(self):
self.say = self.say(what)
def say(self, what):
return 'I say:', what
Um das Ganze mal konkreter zu zeigen:
Code: Alles auswählen
In [26]: class Foo(object):
....: def __getattr__(self, attr):
....: if attr == 'bar':
....: return 'baz'
....:
....:
In [27]: foo = Foo()
In [28]: foo.bar
Out[28]: 'baz'
Code: Alles auswählen
In [29]: foo.bar = 'spam'
In [30]: foo.bar
Out[30]: 'spam'
Mein Ansatz ist bisher dieser:
Code: Alles auswählen
In [128]: class Foo(object):
def __getattr__(self, attr):
if attr == 'bar':
return 'baz'
return getattr(self, attr)
def __setattr__(self, attr, value):
if attr == 'bar':
pass
else:
setattr(self, attr, value)
.....:
.....:
In [138]: foo = Foo()
In [139]: foo.bar
Out[139]: 'baz'
In [140]: foo.bar = 'spam'
In [141]: foo.bar
Out[141]: 'baz'
EDIT: Die zweite Methode lässt sich natürlich einfacher ausdrücken mit `if not attr == 'bar':`.