Ich habe diesen Code:Implementierung __getitem__ in neuen Stil Klassen
class A:
def __init__(self):
def method(self, item):
print self, ": Getting item", item
self.__getitem__ = types.MethodType(method, self, self.__class__)
class B(object):
def __init__(self):
def method(self, item):
print self, ": Getting item", item
self.__getitem__ = types.MethodType(method, self, self.__class__)
Dann funktioniert das gut:
a = A()
a[0]
Aber dies nicht:
b = B()
b[0]
Typeerror erhöhen.
fand ich, dass neuer Stil Klassen magische Methoden in der Klasse __dict__ __dict__ statt Instanz suchen. Ist das richtig? Wieso ist es so? Kennen Sie einen Artikel, der die dahinter stehenden Ideen erklärt? Ich habe versucht, RTFM, aber vielleicht nicht die richtigen oder nicht, das Ding zu fangen ...
Thank you very much! Paul
Ich bin neugierig: Gibt es einen Grund, warum Sie pro Instanz wollen '__getitem__' Implementierungen? Es scheint, als ob du stromaufwärts schwimmst, vielleicht gibt es einen besseren Weg, dein Ziel zu erreichen? –
Ich musste einen Klassen-Proxy erstellen.Im Grunde genommen nimmt die 'ProxyBase' Klasse die Zielklasse in ihrem'__init__' und leitet dann alle Methodenaufrufe an dieses Ziel weiter (definiert'__getattr__'). Dann können Sie eine Unterklasse von 'ProxyBase' machen und (was ich erwartet habe), z.B. definiere '__getitem__'. Dann bleibt die Funktionalität des Proxy-Objekts erhalten (gut ... mit einigen Nachteilen ...), aber mit benutzerdefiniertem Verhalten des '[]' -Operators. Dies funktioniert mit normalen Methoden, aber nicht mit speziellen. –
Noch ein Kommentar: Subclassing wäre das Beste, aber ich muss die vorhandene Instanz dekorieren. Nicht um einen neuen meiner Unterklasse zu erstellen. Ich denke, das ist ein häufiges Problem, das Leute, die Python schreiben, gerne lösen. Grundsätzlich: Wie fügt man einer vorhandenen Klasse Funktionalität hinzu? Beispiel: Ich möchte 'list' mit einigen Methoden dekorieren. Ich könnte Unterklasse, aber dann die "normale" "Liste" nicht haben. Ich kann eine Instanz meiner benutzerdefinierten Klasse erstellen, aber dann müssen die dict-Inhalte kopiert werden. Die Idee ist also, st zu tun. wie 'ListWrapper ([1,2,3])' ', die nur Methodenaufrufe weiterleitet und die ursprüngliche Liste wieder verwendet. –