2010-07-28 3 views
0

J'essaye de créer une classe qui doit être une superclasse d'autres, en traçant leurs requêtes d'attributs. Je pensais à l'aide de « getattribute » qui obtient toutes les demandes d'attributs, mais il génère récursion:Classe Mixin pour suivre les demandes d'attribut - __attribute__ recursion

class Mixin(object): 
def __getattribute__ (self, attr): 
    print self, "getting", attr 
     return self.__dict__[attr] 

Je sais pourquoi je suis récursion: il est pour moi. dict appel qui rappelle getattribute récursivement. J'ai essayé de changer la dernière ligne "return object.__getattribute__(self,attr)" comme suggéré dans d'autres messages mais la récursivité est rappelée.

+2

Utiliser 'objet retour .__ getattribute __ (self, attr)' fonctionne pour moi. Pouvez-vous donner un exemple plus complet de quand vous obtenez la récursivité en utilisant ce code. –

Répondre

5

Essayez ceci:

class Mixin(object): 
    def __getattribute__ (self, attr): 
     print self, "getting", attr 
     return object.__getattribute__(self, attr) 

Si vous obtenez toujours des problèmes de récursion, elle est causée par le code que vous nous avez pas montré

>>> class Mixin(object): 
...  def __getattribute__ (self, attr): 
...   print self, "getting", attr 
...   return object.__getattribute__(self, attr) 
... 
>>> Mixin().__str__ 
<__main__.Mixin object at 0x00B47870> getting __str__ 
<method-wrapper '__str__' of Mixin object at 0x00B47870> 
>>> Mixin().foobar 
<__main__.Mixin object at 0x00B47670> getting foobar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 4, in __getattribute__ 
AttributeError: 'Mixin' object has no attribute 'foobar' 
>>> 

Et voici le résultat lorsqu'il est combiné avec Bob Mylist

>>> class Mylist(Mixin): 
...  def __init__ (self, lista): 
...   if not type (lista) == type (""): 
...    self.value = lista[:] 
...  def __add__ (self,some): 
...   return self.value + some 
...  def __getitem__ (self,item): 
...   return self.value[item] 
...  def __getslice__ (self, beg, end): 
...   return self.value[beg:end] 
... 
>>> a=Mylist([1,2]) 
>>> a.value 
<__main__.Mylist object at 0x00B47A90> getting value 
[1, 2] 
+0

Um ... "J'ai essayé de changer la dernière ligne dans' return object .__ getattribute __ (self, attr) 'comme suggéré dans d'autres messages mais la récursivité est rappelée." - OP – delnan

+0

J'ai déjà essayé que –

+0

@delnan, Bob_Bib, le code que j'ai posté est correct. Si vous voyez encore la récursivité, s'il vous plaît poster tout le code que vous utilisez et le suivi –

0

Ceci est le code:

from Es123 import Mixin 
class Mylist(Mixin): 
    def __init__ (self, lista): 
     if not type (lista) == type (""): 
      self.value = lista[:] 
    def __add__ (self,some): 
     return self.value + some 
    def __getitem__ (self,item): 
     return self.value[item] 
    def __getslice__ (self, beg, end): 
     return self.value[beg:end] 
a = Mylist ([1,2]) 
a.value 

Puis retourne python "RuntimeError: profondeur maximale de récursion exceeded"

+0

Cela devrait fonctionner correctement avec la classe Mixin de ma réponse. Vérifiez que 'Es123.py' a la bonne version de la classe. Si cela ne fonctionne toujours pas, postez tout le retraçage –

+0

Oui, ça marche! Désolé j'ai laissé la mauvaise version donc ça n'a pas fonctionné. Je vous remercie. Pourriez-vous m'expliquer pourquoi cela fonctionne avec object .__ getattribute __ (...) mais pas avec seulement __getattribute __ (...) s'il vous plait? –

+0

'self .__ getattribute__' appelle la méthode' __getattribute__' de Mixin', qui s'appelle récursivement. 'object .__ getattribute__' appelle la méthode' __getattribute__' de 'object' qui est complètement différente de la méthode' Mixin' du même nom. Par conséquent, aucune récursivité. – unutbu