Pregunta

Soy un aprendiz de Python y actualmente pirateando una clase con un número variable de campos como en el Ejemplo de "grupo de cosas con nombre" aquí.

class Bunch:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

También quiero escribir un __setattr__ en esta clase para verificar el nombre del atributo de entrada. Pero el documentación de Python dice,

Si __setattr __ () quiere asignar a un atributo de instancia, no debe simplemente ejecutar "self.name = value", esto causaría una llamada recursiva a sí misma. En cambio, debe insertar el valor en el diccionario de atributos de instancia, por ejemplo, "self .__ dict __ [nombre] = valor". Para clases de estilo nuevo, en lugar de acceder al diccionario de instancias, debe llamar al método de clase base con el mismo nombre, por ejemplo, "Objeto .__ Setattr __ (self, nombre, valor)".

En ese caso, ¿debo usar también? object.__dict__ en el __init__ función para reemplazar self.__dict__?

¿Fue útil?

Solución

No. Debes definir tu clase como class Bunch(object), pero continúa referiéndose a self.__dict__.

Solo necesitas usar el object.__setattr__ Método mientras está definiendo el self.__setattr__ Método para prevenir la recursión infinita. __dict__ no es un método, pero es un atributo en el objeto en sí, por lo que object.__dict__ no funcionaría.

Otros consejos

Puedes usar

class Bunch:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

    def __setattr__(self, name, value):
        #do your verification stuff
        self.__dict__[name] = value

o con clase de nuevo estilo:

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top