Дизайн класса: Последнее изменение - PullRequest
1 голос
/ 23 июля 2010

Мой класс:

class ManagementReview:
    """Class describing ManagementReview Object.
    """

    # Class attributes
    id = 0
    Title = 'New Management Review Object'
    fiscal_year = ''
    region = ''
    review_date = ''
    date_completed = ''
    prepared_by = ''

    __goals = [] # List of <ManagementReviewGoals>.
    __objectives = [] # List of <ManagementReviewObjetives>.
    __actions = [] # List of <ManagementReviewActions>.
    __deliverables = [] # List of <ManagementReviewDeliverable>.
    __issues = [] # List of <ManagementReviewIssue>.

    __created = ''
    __created_by = ''
    __modified = ''
    __modified_by = ''

Атрибут __modified представляет собой строку даты и времени в формате isoformat. Я хочу, чтобы этот атрибут автоматически обновлялся до datetime.now (). Isoformat () каждый раз, когда обновляется один из других атрибутов. Для каждого из других атрибутов у меня есть сеттер, например:

def setObjectives(self,objectives):
    mro = ManagementReviewObjective(args)
    self.__objectives.append(mro)

Итак, есть более простой способ, чем добавить строку вроде:

self.__modified = datetime.now().isoformat()

каждому сеттеру?

Спасибо! :)

Ответы [ 3 ]

5 голосов
/ 23 июля 2010

Чтобы обновить __modified при изменении атрибутов instance (как в вашем примере self.__objectives), вы можете переопределить __setattr__.

Например, вы можете добавить это в свой класс:

def __setattr__(self, name, value):
    # set the value like usual and then update the modified attribute too
    self.__dict__[name] = value
    self.__dict__['__modified'] = datetime.now().isoformat()
0 голосов
/ 23 июля 2010

Если у вас есть метод, который фиксирует изменения, внесенные в эти атрибуты, в базу данных (например, метод save () или метод update_record (). Что-то подобное), вы можете просто добавить

self.__modified = datetime.now().isoformat()

как раз перед тем, как все совершено, так как это единственный раз, когда это действительно имеет значение.

0 голосов
/ 23 июля 2010

Возможно, добавить декоратор перед каждым сеттером?

...