Как лучше выбрать / отменить выбор в иерархиях классов, если родительский и дочерний классы маринованы - PullRequest
4 голосов
/ 24 августа 2010

Предположим, у меня есть класс 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)

1 Ответ

4 голосов
/ 24 августа 2010

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

См. эту статью для получения дополнительной информации о порядке разрешения методов (MRO) и супер.

...