2009-03-26 12 views
1

Pointant la méthode de classe à la méthode d'instance est à l'origine clairement les problèmes:définitions de fonction Rediriger en python

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

donne cette erreur:

File ... in __getitem__ 
    return dict.__getitem__(self, name) 
KeyError: 'a' 

Que dois-je faire ici à la place?

+0

Êtes-vous essayer de définir une fonction de la méthode sans utiliser def ? Pourquoi? Quel est le problème avec def? –

+0

Ce n'est pas dynamique? Supposons que, de même que __getitem__, j'ai eu 20 autres méthodes - je devrais redéfinir chaque méthode. (Je ne fais pas ça, je suis simplement intrigué de savoir quelles sont les autres façons de déclarer les fonctions). – Dan

Répondre

7

__getitem__ ne fonctionne que dans la classe. Vous ne pouvez pas le remplacer dans une instance.

Cela fonctionne:

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 vous souhaitez définir dans __init__ pour une raison étrange, vous devez créer un descripteur:

def __init__(self): 
    self.a = A() 
    def mygetitem(self, item): 
     return self.a[item] 
    B.__getitem__ = types.MethodType(mygetitem, None, B) 
Questions connexes