Question

Ceci est un exemple très artificiel car il est difficile d'expliquer le contexte dans lequel j'ai fini par mettre en œuvre cette solution. Cependant, si quelqu'un peut répondre pourquoi cette particularité particulière arrive, je serais reconnaissant.

L'exemple:

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']

Sorties:

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

Bien que ce soit une façon bizarre de le faire (bien plus serait le sous-classement logique), pourquoi ne pas trouver la méthode que je explicitement défini?

Si je fais ceci:

dir(b)

Je reçois ceci:

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

Le même problème se produit avec d'autres méthodes telles que __iter__. Ce qui est-il définir explicitement cette méthode qui fonctionne?

Était-ce utile?

La solution

Lorsque vous utilisez parenthèses [] python regarde dans la classe. Vous devez définir la méthode dans la classe.

Voici votre code adapté:

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']

Autres conseils

Ceci est parce que vous ne pouvez pas remplacer les méthodes spéciales à la volée.

Je n'ai pas pu trouver une référence à ce sujet mais est essentiellement parce qu'ils sont des méthodes de classe et ne sont pas autorisés à être des méthodes d'instance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top