[Python] Anomalia nella classe?
Marco Giusti
marco.giusti a gmail.com
Sab 22 Giu 2013 14:44:41 CEST
On Sat, Jun 22, 2013 at 02:05:55PM +0200, Gollum1 wrote:
> Come è possibile che funzioni e non mi dia errore? il mio dubbio è
> dato dal fatto che la classe Block() è definita con solo un pass.
>
> come è dunque possibile che io possa aggiungere il blocco di dati e
> poi stamparli? non dovrebbe dare un errore?
>
> (in pratica non ho ancora definito l'attributo data nella classe).
il tuo dubbio è il seguente?
>>> class Block:
... pass
...
>>> b = Block()
>>> b.data = "ciao"
>>> print b.data
ciao
>>>
perché python non ha bisogno di definire un attributo, la definizione è
al momento del primo assegnamento. ogni oggetto ha un attributo
"__dict__" che è il dizionario degli attributi e quanto provi accedere
ad un attributo, accedi anche a quel dizionario.
ho detto anche perché python cerca anche nel dizionario della classe e
dei genitori della classe. in pseudo-python-code è un po' la seguente
cosa (per le classi di tipo nuovo):
def accedi_attributo(self, name):
if name in self.__dict__:
return self.__dict__[name]
else:
for clazz in self.__class__.__mro__:
if name in clazz.__dict__:
return clazz.__dict__[name]
raise AttributeErrorname
per esempio la seguente cosa è più impressionante, imo:
>>> b.foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Block instance has no attribute 'foo'
>>> Block.foo = "bar"
>>> b.foo
'bar'
>>>
tieni conto che la funzione che ho definito è una super semplificazione
che non tiene conto di __getattr__ ne di __getattribute__ attraverso i
quali puoi gestire tu l'accesso agli attributi:
>>> class Superblock(object):
... def __getattr__(self, name):
... if name == "password":
... return "qwerty"
... raise AttributeError
...
>>> b = Superblock()
>>> b.__dict__
{}
>>> b.password
'qwerty'
>>>
ciao
m.
Maggiori informazioni sulla lista
Python