Сериализация данных в pymongo;Как обращаться с сеттером со свойством? - PullRequest
0 голосов
/ 17 октября 2018

Я сериализую __dict__ в монго, но я хочу перехватить настройку laden t.Как я могу сделать это, не переименовывая атрибут в _laden, чтобы использовать свойство с установщиком?

Я знаю, что мог бы заменить свой существующий атрибут laden на property и использовать установщик следующим образом:

def Swallow:
    def __init__(self):
        self._laden = None

    @property
    def laden(self):
        return self._laden

    @laden.setter
    def laden(self, laden):
        updated = some_new_code(laden)
        self._laden = updated

Но это означает, что сериализация __dict__ сохранитимя _laden в базе данных, а не laden, нарушающее мои существующие сохраненные данные.

Мне бы очень хотелось, чтобы оно было:

def Swallow:
    def __init__(self):
        self.laden = None

    @property
    def laden(self):
        return self.laden

    @laden.setter
    def laden(self, laden):
        updated = some_new_code(laden)
        self.laden = updated

Но в последнем случае сеттерназывает себя - обычно это не работает.

Это достижимо?Есть мысли?

1 Ответ

0 голосов
/ 17 октября 2018

Похоже, что ваш реальный вопрос таков:

Я сериализую __dict__ в монго, но я хочу перехватить настройку laden.Как я могу сделать это, не переименовывая атрибут в _laden, чтобы использовать свойство с установщиком?

Вы не можете просто присвоить одно и то же имя экземпляру, нет.self.laden есть и всегда будет обрабатываться объектом property.Если вас интересуют технические мелочи, то прочитайте описание howto ;property объект - это дескриптор данных , что означает, что весь доступ к instance.name обрабатывается исключительно объектом свойства type(instance).name.Без исключений.

Вы можете выполнить любое из следующих действий:

  • Получить доступ к тому же имени в self.__dict__:

    @property
    def laden(self):
        return self.__dict__['laden']
    
    @laden.setter
    def laden(self, laden):
        updated = some_new_code(laden)
        self.__dict__['laden'] = updated
    

    Это обходит обычные object.attribute пути и идет прямо к источнику.

  • Не использовать свойство;Вы можете перехватить настройку атрибута в экземплярах с помощью __setattr__() hook :

    def __setattr__(self, name, value):
        if name == 'laden':
            value = some_new_code(laden)
        super().__setattr__(name, value)
    

    Это перехватит весь доступ instance.some_name, но только если some_name равен 'laden', вына самом деле сделать что-то с этим значением.

  • Определите пользовательский метод для базового класса, который может обрабатывать сериализацию для вас, и добавьте конфигурацию в ваш класс в метод, который ищет, чтобы помочь ему решить, чтоатрибуты для сериализации, или пусть метод автоопределит property объекты.Это позволило бы вам включить перевод _name в name.

  • Использовать библиотеку MongoDB ORM для обработки сериализации вашего объекта.Я уверен, что некоторые из них допускают настраиваемые установщики для их полей или, по крайней мере, позволяют определять собственные типы настраиваемых полей, которые позволяют изменять значения при настройке.

...