Redireccionamiento de definiciones de funciones en pitón
-
22-08-2019 - |
Pregunta
Señalar el método de la clase en el método de instancia está causando claramente problemas:
class A(dict):
def __getitem__(self, name):
return dict.__getitem__(self, name)
class B(object):
def __init__(self):
self.a = A()
B.__getitem__ = self.a.__getitem__
b1 = B()
b1.a['a'] = 5
b2 = B()
b2.a['b'] = 10
c = b1['a']
d = b2['b']
da este error:
File ... in __getitem__
return dict.__getitem__(self, name)
KeyError: 'a'
¿Qué debería estar haciendo aquí en su lugar?
Solución
__getitem__
sólo funciona en la clase. No se puede reemplazar en una base de caso.
Esto funciona:
class A(dict):
def __getitem__(self, name):
return dict.__getitem__(self, name)
class B(object):
def __init__(self):
self.a = A()
def __getitem__(self, item):
return self.a[item]
b1 = B()
b1.a['a'] = 5
b2 = B()
b2.a['b'] = 10
c = b1['a']
d = b2['b']
Si desea definir en __init__
por alguna extraña razón, se debe crear un descriptor:
def __init__(self):
self.a = A()
def mygetitem(self, item):
return self.a[item]
B.__getitem__ = types.MethodType(mygetitem, None, B)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow