getters / setters для класса Python, который наследует dict - PullRequest
1 голос
/ 13 октября 2011

Чтобы помочь в сериализации в JSON, я обычно создаю класс, который наследуется от класса python dict. Если предполагается, что у класса есть определенные поля, я хочу, чтобы там были методы для получения и установки.

В настоящее время я создаю класс как:

class MyRequest(dict):
    def __init__(self, firstName=None, lastName=None):
        self['firstName'] = firstName
        self['lastName'] = lastName

    def get_firstName(self):
        return self['firstName']
    def set_firstName(self, firstName):
        self['firstName'] = firstName

    def get_lastName(self):
        return self['lastName']
    def set_lastName(self, lastName):
        self['lastName'] = lastName

Но с этим действительно сложно работать. Поскольку базовое «хранилище» - это словарь, я не могу просто получить доступ к таким полям, как

myReq.firstName = "Foo"
print myReq.lastName

Но есть ли способ попасть туда, сохраняя при этом поддержку диктата?

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Как насчет:

class MyRequest(dict):
    def __init__(self, firstName=None, lastName=None):
        self['firstName'] = firstName
        self['lastName'] = lastName

    def __getattr__(self, name):
        return self[name]

    def __setattr__(self, name, value):
        self[name] = value

Обратите внимание, что это может вас преследовать, если один из ваших атрибутов имеет то же имя, что и метод dict (например, update).В этом случае получение атрибута вернет метод, а его установка перезапишет метод.Это может быть трудно отладить.

1 голос
/ 13 октября 2011

Да, есть способ сделать то, что вы хотите. Используйте свойства:

class MyRequest(dict):
    def __init__(self, firstName=None, lastName=None):
        self['firstName'] = firstName
        self['lastName'] = lastName

    @property
    def firstName(self):
        return self['firstName']

    @firstName.setter
    def firstName(self, firstName):
        self['firstName'] = firstName

    @property
    def lastName(self):
        return self['lastName']

    @lastName.setter
    def lastName(self, lastName):
        self['lastName'] = lastName

request = MyRequest('John', 'Connor')
print request.firstName, request.lastName
request.firstName = 'Sarah'
print request.firstName, request.lastName
...