[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