Classi a Runtime in Ruby e Python

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


Nel messaggio <42121a81$0$32333$5fc30a8@news.tiscali.it> su comp.lang.python, l’autore parla della possibilita’ di creare classi a runtime in python o ruby: In Python, la creazione di una classe e’ gia’ di per se dinamica:
 class miaclasse: pass
In qualunque momento si puo’ creare una classe, ad es. da una funzione. In ruby, essendo le classi dichiarate costanti, in runtime bisogna creare una classe ricorrendo all’istanza di Class:
 miaclasse = Class.new()
Il problema e’ che facendo miaclasse.new() non si avra’ una instanza di miaclasse ma di Class. Quindi ribadisco la mia opinioni sulla dinamicita’ del Python sulle classi.

Andiamo per gradi. In ruby, diversamente da python, esiste un concetto di “costante”. In realta’ e’ sempre possibile riassegnare una costante, a meno che non si imposti un safe level che lo proibisca. Come si definisce una costante? Semplice, le si da un nome maiuscolo, ovvero si adotta come regola quella che e’ una convenzione in molti altri linguaggi. Ovviamente le costanti devono essere create staticamente, e quindi non e’ possibile dichiararle all’interno di strutture di controllo come metodi o if-then-else.

Inoltre, in ruby, diversamente da python, c’e’ una restrizione sulla creazione di classi e moduli, essi devono essere costanti.

Ma queste restrizioni esistono solo a livello sintattico, e non strutturale. Perche’? Perche’ ruby, in generale, suggerisce un certo modo di programmare, ma quasi mai lo impone.

Dunque dovendo creare una classe in un metodo, si puo’; semplicemente chiedere alla classe delle classi Class di darcene una:

 >> c=Class.new
 => #<Class:0x2be89e0>
facile, creiamo ora un’istanza:
 >> i=c.new
 => #<#<Class:0x2be89e0>:0x2be7600>
brutto ouput, vero? in realta’ e’ abbastanza normale: l’identita’; della classe non puo’ essere determinata, e quindi corrisponde semplicemente alla rappresentazione di oggetto qualunque, ovvero il risultato della prima operazione. e viene usato per costruire la stringa seguente, che altro non e’ che:
#<rappresentazione_classe:id_oggetto>
dunque, facciamo una prova finale:
 >> def dammi_una_classe_e_un_oggetto
 >>  c=Class.new
 >>  i=c.new
 >>  return c,i
 >> end
 => nil
 >> classe,oggetto=dammi_una_classe_e_un_oggetto()
 => [#<Class:0x2bd91e8>, #<#<Class:0x2bd91e8>:0x2bd91b8>]
 >> oggetto.class == classe.class
 => false
 >> oggetto.class == classe
 => true
 >> classe.class
 => Class
 >> oggetto.class
 => #<Class:0x2bd91e8>

Insomma, nessun problema potete crearvi le classi dove vi pare :)

Updated on November 25, 2005 14:00 by Ruby Fan (127.0.0.1)