Re: [Python] creazione attributi di classe da dizionario

2013-10-20 Per discussione Marco Buttu

On 10/19/2013 12:01 PM, Manlio Perillo wrote:

On 19/10/2013 09:32, Riccardo mancuso wrote:

ciao a tutti,
volevo chiedere se è possibile creare degli attributi di una classe,
partendo da un dizionario.


Si, è possibile.
Gli attributi di una classe sono normalmente memorizzati del 
dizionario __dict__.



Mi spiego:
supponiamo di avere un dizionario del tipo:

dizionario={auto:1,
 casa:2,
 moto:3}

e poi di creare una classe lista_oggetti:

class lista_oggetti(dizionario):
 def __init__(self,dizionario):
 pass



Ti basta fare:

self.__dict__.update(dizionario) 


Riportando la domanda dello OP:

# --- BEGIN OP
class lista_oggetti(dizionario):
def __init__(self,dizionario):
pass

vorrei fare in modo che vengano creati automaticamente gli attributi 
specificati in dizionario, cioè:


lista_oggetti.auto
lista_oggetti.casa
lista_oggetti.moto
# --- END OP

sembra che voglia creare degli attributi _di classe_ piuttosto che di 
istanza. Una precisazione quindi (per lui ovviamente, non per te ;) )
Se fai come ha suggerito Manlio, osserva che crei degli attributi _di 
istanza_, non di classe:


 class Foo:
... def __init__(self, d):
... self.__dict__.update(d)
...
 f = Foo({'foo': 100})
 f.foo
100
 Foo.foo
Traceback (most recent call last):
  File stdin, line 1, in module
AttributeError: type object 'Foo' has no attribute 'foo'

Se vuoi creare degli attributi _di classe_, e vuoi farlo dopo che la 
classe e' stata creata, puoi fare ad esempio:


 class Foo:
... def __init__(self, d):
... for k, v in d.items():
... setattr(type(self), k, v) # Vedi sotto la nota sul 
perche' ho usato setattr()

...
 f = Foo({'foo': 100})
 f.foo
100
 Foo.foo
100

Se invece vuoi aggiungere gli attributi prima della creazione della 
class Foo, perche' vuoi farlo prima che __new__() trasformi in dizionari 
in mappingproxy, o per altri motivi, allora devi necessariamente usare 
la soluzione con metaclasse, che ti ho proposto prima.


Alcune precisazioni sul perche' ho usato setattr(). In Python 2 avresti 
potuto fare:


 class Foo:
... def __init__(self, d):
... Foo.__dict__.update(d)
...
 f = Foo({'foo': 100})
 f.foo
100
 Foo.foo
100

Infatti in Python 2 Foo.__dict__ e' un normale dizionario ordinario 
(tipo dict):


 sys.version_info
sys.version_info(major=2, minor=7, micro=3, releaselevel='final', serial=0)
 type(Foo.__dict__)
type 'dict'

In Python 3 pero' Foo.__dict__ non e' un dizionario ordinario, ma un 
oggetto di tipo types.MappingProxyType:


 import sys
 sys.version_info
sys.version_info(major=3, minor=3, micro=2, releaselevel='final', serial=0)
 type(Foo.__dict__)
class 'mappingproxy'
 import types
 type(Foo.__dict__) is types.MappingProxyType
True

Questo oggetto e' un descriptor:

 type(Foo.__dict__['__dict__'])
class 'getset_descriptor'

e il suo metodo __set__() ci impedisce di fare, nello stesso identico 
modo, quanto abbiamo fatto sopra con Python 2:


 class Foo:
... def __init__(self, d):
... Foo.__dict__.update(d)
...
 f = Foo({'foo': 100})
Traceback (most recent call last):
...
AttributeError: 'mappingproxy' object has no attribute 'update'

E non possiamo fare neppure un assegnamento:

 class Foo:
... def __init__(self, d):
... for k, v in d.items():
... Foo.__dict__[k] = v
...
 f = Foo({'foo': 100})
Traceback (most recent call last):
...
TypeError: 'mappingproxy' object does not support item assignment

Questo e' il motivo per cui ho usato setattr(): usando setattr() il 
codice funziona sia in Python 2 che in Python 3.


--
Marco Buttu

INAF - Osservatorio Astronomico di Cagliari
Via della Scienza, Loc. Cuccuru Angius
09047 Selargius (CA)
Phone: 070 711 80 217
Email: mbu...@oa-cagliari.inaf.it

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-20 Per discussione Marco Buttu

On 10/20/2013 09:36 AM, Marco Buttu wrote:


In Python 3 pero' Foo.__dict__ non e' un dizionario ordinario, ma un 
oggetto di tipo types.MappingProxyType:


 import sys
 sys.version_info
sys.version_info(major=3, minor=3, micro=2, releaselevel='final', 
serial=0)

 type(Foo.__dict__)
class 'mappingproxy'
 import types
 type(Foo.__dict__) is types.MappingProxyType
True 
Preciso ulteriormente che stiamo parlando del dizionario degli attributi 
di classe, perche' quello degli attributi di istanza e' un dizionario 
ordinario anche in Python 3:


 import sys
 sys.version_info
sys.version_info(major=3, minor=3, micro=2, releaselevel='final', serial=0)
 class Foo:
... pass
...
 f = Foo()
 type(f.__dict__)
class 'dict'


--
Marco Buttu

INAF - Osservatorio Astronomico di Cagliari
Via della Scienza, Loc. Cuccuru Angius
09047 Selargius (CA)
Phone: 070 711 80 217
Email: mbu...@oa-cagliari.inaf.it

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-20 Per discussione Daniele Zambelli
Il 19 ottobre 2013 20:13, Riccardo mancuso
mancuso.riccard...@gmail.com ha scritto:
 quale impostazione devo impostare su gmail per avere il quoting corretto ?

Prima di rispondere, selezioni la parte di messaggio che vuoi riportare.

-- 

Daniele

www.fugamatematica.blogspot.com

giusto!
nel verso
forse è perché non guardiamo le cose
Quando non ci capiamo,
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


[Python] creazione attributi di classe da dizionario

2013-10-19 Per discussione Riccardo mancuso
ciao a tutti,
volevo chiedere se è possibile creare degli attributi di una classe,
partendo da un dizionario.
Mi spiego:
supponiamo di avere un dizionario del tipo:

dizionario={auto:1,
casa:2,
moto:3}

e poi di creare una classe lista_oggetti:

class lista_oggetti(dizionario):
def __init__(self,dizionario):
pass

vorrei fare in modo che vengano creati automaticamente gli attributi
specificati in dizionario, cioè:

lista_oggetti.auto
lista_oggetti.casa
lista_oggetti.moto

da utilizzare in seguito nella chiamata dell'istanza.
E' possibile ?
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-19 Per discussione Marco Buttu

On 10/19/2013 09:32 AM, Riccardo mancuso wrote:
volevo chiedere se è possibile creare degli attributi di una classe, 
partendo da un dizionario.

...
da utilizzare in seguito nella chiamata dell'istanza.
E' possibile ?


Certo :) La soluzione migliore in questo caso e' far fare il lavoro ad 
una metaclasse, all'atto della preparazione del dizionario degli 
attributi. Il metodo __prepare__() della metaclasse viene chiamato prima 
di tutto, ed il suo compito e' per l'appunto preparare il dizionario 
degli attributi. Come puoi vedere e' semplicissimo (Python 3):


 class MyMetaclass(type):
... def __prepare__(clsname, bases):
... return {'auto': 1, 'casa': 2, 'moto': 3}


Dopo che __prepare__() ha restituito il dizionario, Python aggiunge 
alcuni attributi speciali, dopodiche' passa il dizionario al metodo 
__new__() della metaclasse, che si occupa di istanziare la classe. 
Quindi non devi far altro che far istanziare la tua classe da 
MyMetaclass, e lei fara' il lavoro per te:


 class MyClass(metaclass=MyMetaclass):
... pass
...
 foo = MyClass()
 foo.auto, foo.casa, foo.moto
(1, 2, 3)

Ciao, M.

--
Marco Buttu

INAF - Osservatorio Astronomico di Cagliari
Via della Scienza, Loc. Cuccuru Angius
09047 Selargius (CA)
Phone: 070 711 80 217
Email: mbu...@oa-cagliari.inaf.it

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-19 Per discussione Manlio Perillo

On 19/10/2013 09:32, Riccardo mancuso wrote:

ciao a tutti,
volevo chiedere se è possibile creare degli attributi di una classe,
partendo da un dizionario.


Si, è possibile.
Gli attributi di una classe sono normalmente memorizzati del 
dizionario __dict__.



Mi spiego:
supponiamo di avere un dizionario del tipo:

dizionario={auto:1,
 casa:2,
 moto:3}

e poi di creare una classe lista_oggetti:

class lista_oggetti(dizionario):
 def __init__(self,dizionario):
 pass



Ti basta fare:

self.__dict__.update(dizionario)

 [...]


Ciao  Manlio
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-19 Per discussione Riccardo mancuso
grazie Manlio.
perfetto !


Il giorno 19 ottobre 2013 12:01, Manlio Perillo
manlio.peri...@gmail.comha scritto:

 On 19/10/2013 09:32, Riccardo mancuso wrote:

 ciao a tutti,
 volevo chiedere se è possibile creare degli attributi di una classe,
 partendo da un dizionario.


 Si, è possibile.
 Gli attributi di una classe sono normalmente memorizzati del dizionario
 __dict__.


  Mi spiego:
 supponiamo di avere un dizionario del tipo:

 dizionario={auto:1,
  casa:2,
  moto:3}

 e poi di creare una classe lista_oggetti:

 class lista_oggetti(dizionario):
  def __init__(self,dizionario):
  pass


 Ti basta fare:

 self.__dict__.update(**dizionario)

  [...]


 Ciao  Manlio

 __**_
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/**mailman/listinfo/pythonhttp://lists.python.it/mailman/listinfo/python

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-19 Per discussione Marco Beri
On 19 Oct 2013 18:29, Riccardo mancuso mancuso.riccard...@gmail.com
wrote:

 grazie Manlio.
 perfetto !

Non come il tuo quoting :-)

Ciao.
Marco.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-19 Per discussione Riccardo mancuso
scusa marco, quale impostazione devo impostare su gmail per avere il
quoting corretto ?


Il giorno 19 ottobre 2013 19:10, Marco Beri marcob...@gmail.com ha
scritto:

 On 19 Oct 2013 18:29, Riccardo mancuso mancuso.riccard...@gmail.com
 wrote:
 
  grazie Manlio.
  perfetto !

 Non come il tuo quoting :-)

 Ciao.
 Marco.

 ___
 Python mailing list
 Python@lists.python.it
 http://lists.python.it/mailman/listinfo/python


___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-19 Per discussione Valerio Maggio
Riccardo mancuso mancuso.riccard...@gmail.com wrote:

 scusa marco, quale impostazione devo impostare su gmail per avere il quoting 
 corretto ?
 Marco Beri marcob...@gmail.com ha scritto:
 Non come il tuo quoting :-)
 
 Ciao.
 Marco.
 
Nessuna! Devi solo editare manualmente la risposta, evitando il top quoting :)
Per fare le cose veramente per bene, dovresti anche opportunamente editare il 
messaggio in modo da quotare solo la parte veramente necessaria a capire a cosa 
ti stai riferendo nella risposta, ma qui andiamo di fino…

--
valerio


___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] creazione attributi di classe da dizionario

2013-10-19 Per discussione Marco Beri
On 19 Oct 2013 20:13, Riccardo mancuso mancuso.riccard...@gmail.com
wrote:

 scusa marco, quale impostazione devo impostare su gmail per avere il
quoting corretto ?

Niente da fare. Nessun settings.

Ma per fortuna basta un pizzico di manualità come ho fatto ora.

;-)

Ciao.
Marco.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python