2010-08-24 2 views
4

Предположим, что у меня есть класс A и класс B, который является производным от A. Я хочу разборки/разборки экземпляра класса B. Оба и B определяют методы __getstate __/__ setstate__ (предположим, что A и B являются сложными, что делает необходимым использование __getstate__ и __setstate__). Как B должен вызывать методы __getstate __/__ setstate__ для A? Мой текущий, но, возможно, не «правильный» подход:Как наилучшим образом распиливать/разглаживать в иерархиях классов, если экземпляры родительского и дочернего классов маринуются

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) 

ответ

4

Я хотел бы использовать super(B,self) получить экземпляры B для вызова методов 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) 

Смотрите this article для получения дополнительной информации о разрешении методы (MRO) и супер.