Pregunta relacionada con la nueva clase de estilo Python
-
26-10-2019 - |
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__
?
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)