Domanda

Sono uno studente di pitone e attualmente l'hacking una classe con un numero variabile di campi come nel "Grappolo di chiamato Stuff" esempio qui .

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

ho anche voglia di scrivere un __setattr__ in questa classe, al fine di controllare il nome attributo di input. Ma, il documentazione pitone dice:

Se __setattr __ () vuole assegnare a un attributo esempio, non dovrebbe eseguire semplicemente "self.name = valore" - questo causerebbe una chiamata ricorsiva a si. Invece, dovrebbe inserire il valore nel dizionario dell'istanza attributi, ad esempio, "self .__ dict __ [name] = Valore". Per classi di nuovo stile, piuttosto che l'accesso al dizionario esempio, dovrebbe chiamare il metodo della classe base con lo stesso nome, ad esempio, "Oggetto .__ setattr __ (self, nome, valore)".

In questo caso, devo anche usare object.__dict__ nella funzione __init__ per sostituire self.__dict__?

È stato utile?

Soluzione

No. Si dovrebbe definire la classe come class Bunch(object), ma continuare a fare riferimento a self.__dict__.

Hai solo bisogno di usare il metodo object.__setattr__ mentre si sta definendo il metodo self.__setattr__ per evitare una ricorsione infinita. __dict__ non è un metodo, ma è un attributo sull'oggetto stesso, così object.__dict__ non funzionerebbe.

Altri suggerimenti

È possibile utilizzare

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 classe di nuovo stile:

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top