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__?

Était-ce utile?

La solution

Non

. 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top