Как сохранить атрибут вне __dict__? - PullRequest
3 голосов
/ 13 июня 2011

Я создаю серию экземпляров объектов, атрибуты которых я сохраняю и загружаю, используя их атрибут __dict__. Я хотел бы оставить некоторые атрибуты вне __dict__ просто потому, что не хочу, чтобы они были сохранены или загружены.

Более конкретно:

Я создал родительский объект, просто содержащий список дочерних объектов. Дочерние объекты __dict__ сохраняются в файл и загружаются позже, чтобы их снова создать. Я хочу, чтобы дочерние объекты имели ссылку на родительский объект, но я не хочу, чтобы эта ссылка сохранялась или загружалась из файла, поскольку это не имело бы смысла.

Существует ли какой-либо синтаксис, исключающий атрибут из __dict__?

PS: во многих ответах предлагается использовать pickle, в настоящее время я использую json, чтобы данные читались человеком.

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Добавьте префикс для атрибутов, которые вы не хотите сохранять, и исключите их при сохранении.

1 голос
/ 13 июня 2011

Если вы используете Python pickle , вы можете создать два метода __getstate__ и __setstate__, которые позволят вам настроить атрибут для выборавот так:

class Coordinate(object):
     def __init__(self, x, y, z=0):
         self.x, self.y, self.z = x, y, z

     def __getstate__(self):
        """By default if no __getstate__ was defined __dict__ will be pickle, but in
        this case i don't want to pickle self.z attribute because of that this
        method return a dict in the form {'x': ..., 'y': ...}.

        """   
        return {
            "x": self.x,
            "y": self.y,
        }

    def __setstate__(self, data):
        self.__init__(data["x"], data["y"])
1 голос
/ 13 июня 2011

Этот подход не сработает и поэтому не решит вашу проблему.Вместо этого вы должны расширить свою среду, чтобы позволить вам указать, какие атрибуты должны быть пропущены при сохранении / загрузке.

Однако, кажется странным, что вы не используете один из встроенных методов сохранения, например, pickle, которые уже предлагают такие функции.

0 голосов
/ 13 июня 2011

Вы можете переопределить методы __getattr__ и __setattr__ вашего объекта, чтобы скрыть свои атрибуты от __dict__.Но вам нужно хранить ваши дополнительные атрибуты где-то еще.Кроме того, очень трудно определить, какие члены действительно есть у вашего объекта.Так что это скорее взлом, чем хорошее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...