Python New-Styless, связанный с классом
-
26-10-2019 - |
Вопрос
Я ученик Python и в настоящее время взламывает класс с переменным количеством полей, как в Пример "куча названных вещей" здесь.
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
Я также хочу написать __setattr__
В этом классе, чтобы проверить имя атрибута ввода. Но Документация Python говорит,
Если __setattr __ () хочет назначить атрибут экземпляра, он не должен просто выполнять «self.name = value» - это вызвало бы рекурсивный вызов для себя. Вместо этого он должен вставить значение в словаре атрибутов экземпляра, например, «Self .__ Dict __ [name] = value». Для классов нового стиля, вместо того, чтобы получить доступ к словарю экземпляра, он должен вызвать метод базового класса с тем же именем, например, «Object .__ Setattr __ (Self, имя, значение)».
В этом случае, если я также использую object.__dict__
в __init__
функция для замены self.__dict__
?
Решение
Нет. Вы должны определить свой класс как 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)