Как лучше всего выбрать/разобрать в иерархии классов, если экземпляры родительского и дочернего классов маринуются

Предположим, у меня есть класс A и класс B, производный от A. Я хочу распарить/разобрать экземпляр класса B. И A, и 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)

person Christian    schedule 24.08.2010    source источник


Ответы (1)


Я бы использовал 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)

Дополнительную информацию о порядке разрешения методов см. в этой статье. (ТОиР) и супер.

person unutbu    schedule 24.08.2010