Переопределение / блокировка __set__ в db.Property для принудительного применения метода / процесса альтернативного набора - PullRequest
0 голосов
/ 25 июня 2011

Я пытаюсь создать подкласс db.Property и переопределить метод set для реализации таких вещей, как логика до и после установки.

Проблема в том, что __set__ вызывается непосредственно в свойстве db.Model.__init__() во время преобразования from_entity сущности в экземпляр (после того, как оно выходит из хранилища данных), поэтому, очевидно, логика до и после установки не должна быть названным.

class MyProperty(db.StringProperty):
    def __set__(model_instance, value):
        self.pre_set(value)
        super(MyProperty.__set__(model_instance, value)
        self.post_set(value)


class MyModel(db.Model):
    foo = MyProperty()

my_model = MyModel()
my_model.put()
my_model.foo = u'A new string.' """pre/post set logic runs."""

#onload the __set__ method will be called again
loaded_model = db.get(my_model.key())

# In db.Model.__init__()
for prop in self.properties().values():
    value = kwargs.get(prop.name, None) or prop.default() #or something like that
    prop.__set__(self, value) """pre/post set logic also runs :("""

Как я могу различить эти два случая, не переопределяя db.Model.__init__()? или я должен просто сделать это? Разве я не должен делать это с prop.__set__()?

1 Ответ

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

К сожалению, нет простого способа различить две ситуации. Вы могли бы проверить стек, но это очень грязный подход. Вы можете переопределить Model.__init__ - либо с помощью обезьяньей заплатки, либо потребовав от пользователей вашего свойства расширить ваш подкласс пользовательской модели - но я не уверен, как бы вы изменили его таким образом, чтобы это помогло сохранить обратную совместимость с существующими классами свойств .

Возможно, вы захотите проверить Проект NDB Гвидо - он может быть более гибким в этом отношении и все еще находится в активной разработке.

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