Frage

Dies ist ein sehr konstruiertes Beispiel, da es nicht einfach ist, den Kontext zu erklären, in dem ich die Implementierung dieser Lösung beendet haben werden. wenn jemand kann jedoch beantworten, warum diese besondere Eigentümlichkeit der Fall ist, würde ich dankbar sein.

Beispiel:

class A(dict):  
    def __init__(self):
        self['a'] = 'success'

    def __getitem__(self, name):
        print 'getitem'
        return dict.__getitem__(name)

class B(object):
    def __init__(self):
        self._a = A()
        setattr(self, '__getitem__', self._a.__getitem__) 

b = B()
c = b['a']

Diese Ausgänge:

c = b['a']
TypeError: 'B' object is unsubscriptable

Auch wenn es eine bizarre Art und Weise ist, dies zu tun (klar war logisch Subklassen), warum es nicht die Methode findet ich explizit festgelegt habe?

Wenn ich dies tun:

dir(b)

Ich bekomme diese:

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_a']

Das gleiche Problem tritt mit anderen Methoden wie __iter__. Was ist es über diese Methode explizit zu definieren, das funktioniert?

War es hilfreich?

Lösung

Wenn Sie Klammern verwenden [] sieht Python in der Klasse. Sie müssen die Methode in der Klasse.

Hier ist der Code angepasst:

class A(dict):  
    def __init__(self):
        self['a'] = 'success'

    def __getitem__(self, name):
        print 'getitem!'
        return dict.__getitem__(self, name)

class B(object):
    def __init__(self):
        self._a = A()
        B.__getitem__ = self._a.__getitem__

b = B()
c = b['a']

Andere Tipps

Das ist, weil Sie nicht Sonderklasse Methoden on the fly außer Kraft setzen können.

Ich war nicht in der Lage eine Referenz darüber zu finden, aber ist im Grunde, weil sie Klassenmethoden sind und dürfen nicht Instanz Methoden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top