Вопрос, связанный с новым стилем Python
Я учусь на питоне и в настоящее время хакую класс с переменным количеством полей, как в примере "Связка именованных вещей".
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
Я также хочу написать __setattr__
в этом классе, чтобы проверить имя входного атрибута. Но в документации Python сказано:
Если __setattr__() хочет назначить атрибут экземпляра, он не должен просто выполнять "self.name = value" - это вызовет рекурсивный вызов самого себя. Вместо этого он должен вставить значение в словарь атрибутов экземпляра, например, "self.__dict__[name] = value". Для классов нового стиля вместо доступа к словарю экземпляров следует вызывать метод базового класса с тем же именем, например, "object.__setattr__(self, name, value)".
В этом случае, я должен также использовать object.__dict__
в __init__
функция для замены self.__dict__
?
2 ответа
Нет. Вы должны определить свой класс как class Bunch(object)
, но продолжайте ссылаться на self.__dict__
,
Вам нужно только использовать object.__setattr__
метод в то время как вы определяете self.__setattr__
метод предотвращения бесконечной рекурсии. __dict__
это не метод, а атрибут самого объекта, поэтому object.__dict__
не будет работать.
Ты можешь использовать
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
def __setattr__(self, name, value):
#do your verification stuff
self.__dict__[name] = value
или с классом нового стиля:
class Bunch(object):
def __init__(self, **kwds):
self.__dict__.update(kwds)
def __setattr__(self, name, value):
#do your verification stuff
super(Bunch, self).__setattr__(name, value)