Python question nouvelle style liée à la classe
-
26-10-2019 - |
Question
Je suis un étudiant de python et actuellement le piratage une classe à nombre variable de champs dans la section "Bunch of Stuff nommé" exemple .
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
Je veux aussi écrire un __setattr__
dans cette classe afin de vérifier le nom d'attribut d'entrée. Mais, la documentation python dit,
Si __setattr __ () veut attribuer à un attribut d'instance, il ne devrait pas simplement exécuter « self.name = valeur » - cela provoquerait un appel récursif lui-même. , Il devrait plutôt insérer la valeur dans le dictionnaire de l'instance attributs, par exemple, « self .__ dict __ [nom] = Valeur ». Pour les classes de nouveau style, plutôt que accès au dossier des cas, il devrait appeler la méthode de classe de base avec le même nom, par exemple, « Objet .__ setattr __ (self, nom, valeur) ».
Dans ce cas, je également utiliser object.__dict__
dans la fonction __init__
pour remplacer self.__dict__
?
La solution
. Vous devez définir votre classe comme class Bunch(object)
, mais continuer à se référer à self.__dict__
.
Vous ne devez utiliser la méthode object.__setattr__
pendant que vous définissez la méthode self.__setattr__
pour éviter une récursion infinie. __dict__
est pas une méthode, mais est un attribut sur l'objet lui-même, donc object.__dict__
ne marcherait pas.
Autres conseils
Vous pouvez utiliser
class Bunch:
def __init__(self, **kwds):
self.__dict__.update(kwds)
def __setattr__(self, name, value):
#do your verification stuff
self.__dict__[name] = value
ou classe du nouveau style:
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)