2010-08-24 16 views
4

Supposons que j'ai une classe A et une classe B dérivée de A. Je veux décaper/décoller une instance de classe B. Les deux A et B définissent les méthodes __getstate __/__ setstate__ (Supposons que A et B sont complexes, ce qui rend nécessaire l'utilisation de __getstate__ et __setstate__). Comment B devrait-il appeler les méthodes __getstate __/__ setstate__ de A? Mon actuelle, mais peut-être pas l'approche « droit »:Comment choisir/décoder au mieux dans les hiérarchies de classe si les instances de classes parent et enfant sont décapées

class A(object): 
    def __init__(): 
     self.value=1 
    def __getstate__(self): 
     return (self.value) 
    def __setstate__(self, state): 
     (self.value) = state 

class B(A): 
    def __init__(): 
     self.anothervalue=2 
    def __getstate__(self): 
     return (A.__getstate__(self), self.anothervalue) 
    def __setstate__(self, state): 
     superstate, self.anothervalue = state 
     A.__setstate__(self, superstate) 

Répondre

4

Je voudrais utiliser super(B,self) pour obtenir des instances de B pour appeler les méthodes de A:

import cPickle 
class A(object): 
    def __init__(self): 
     self.value=1 
    def __getstate__(self): 
     return self.value 
    def __setstate__(self, state): 
     self.value = state 

class B(A): 
    def __init__(self): 
     super(B,self).__init__() 
     self.anothervalue=2 
    def __getstate__(self): 
     return (super(B,self).__getstate__(), self.anothervalue) 
    def __setstate__(self, state): 
     superstate, self.anothervalue = state 
     super(B,self).__setstate__(superstate) 

b=B() 
with open('a','w') as f: 
    cPickle.dump(b,f) 


with open('a','r') as f: 
    c=cPickle.load(f) 
print(b.value) 
print(b.anothervalue) 

Voir this article pour plus d'informations sur la résolution de la méthode commande (MRO) et super.