python: отслеживание изменений в классе, чтобы сохранить их в конце - PullRequest
2 голосов
/ 24 июля 2010
class A(object):
    def __init__(self):
        self.db = create_db_object()

    def change_Db_a(self):
         self.db.change_something()
         self.db.save()

    def change_db_b(self):
         self.db.change_anotherthing()
         self.db.save()

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

Ответы [ 2 ]

3 голосов
/ 24 июля 2010

Не полагайтесь на метод __del__ для сохранения вашего объекта. Подробности см. В этом сообщении в блоге .

Вы можете использовать протокол управления контекстом , определив __enter__ и __exit__ методы:

class A(object):
    def __enter__(self):
        print 'enter'
        # create database object here (or in __init__)
        pass

    def __exit__(self, exc_type, exc_val, exc_tb):
        print 'exit'
        # save database object here

    # other methods

Затем используйте оператор with при создании объекта:

with A() as myobj:
    print 'inside with block'
    myobj.do_something()

При вводе блока with будет вызван метод A.__enter__. При выходе из блока with будет вызван метод __exit__. Например, с кодом выше вы должны увидеть следующий вывод:

введите

внутри с блоком

выход

Подробнее о выражении with:

1 голос
/ 24 июля 2010

Вы можете определить метод del .

def __del__(self):
    self.db.save()

Но учтите, что это нарушает согласованность данных.

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