Python di nuovo stile di classe legati domanda
-
26-10-2019 - |
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__
?
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)