Subsections

4 Argomenti opzionali

Nel problema precedente abbiamo costruito tre oggetti della classe Point e tre oggetti della classe Segment.

Per creare un punto dobbiamo passargli due argomenti, due numeri che vengono messi nei parametri x e y del costruttore dell'oggetto. Nel caso del punto i due numeri rappresentano le coordinate.

Per creare un segmento dobbiamo passargli due punti che vengono messi nei parametri a e b dell'oggetto. Nel caso del segmento i due punti rappresentano gli estremi.

Se tentassimo di costruire un punto senza fornirgli due numeri, pykig.py non saprebbe cosa fare e si fermerebbe segnalandoci il suo problema. E lo stesso avverrebbe se invece di numeri passassimo come coordinate delle stringhe o degli altri oggetti. Un discorso analogo vale per la classe Segment.

Quindi Point ha due parametri che devono essere riempiti obbligatoriamente da due numeri, Segment ha due parametri che devono essere riempiti obbligatoriamente da due punti.

Il costruttore di ogni oggetto di pykig.py deve essere chiamato con degli argomenti obbligatori, ma può anche essere chiamato con degli argomenti opzionali. Se non vengono specificati questi argomenti assumono un valore predefinito (valore di ``default'').

La seguente tabella riporta i parametri opzionali e il loro significato:

parametro significato
shown L'oggetto viene visualizzato, ma potrebbe essere nascosto se shown vale HIDDEN
name È una stringa che rappresenta il nome dell'oggetto.
internal Se internal vale True, l'oggetto viene utilizzato solo nella costruzione di altri oggetti, ma non viene visualizzato. Produce un effetto più radicale di quello prodotto da shown.
width Dimensioni dell'oggetto
pointstyle Stile del punto.
linestyle Stile della linea.
color Colore dell'oggetto.

La seguente tabella riporta i parametri e i loro possibili valori. Il primo valore è quello predefinito:

parametro valore predefinito, altri valori
shown VISIBLE, HIDDEN
name "none", qualunque altra stringa
internal False, True
width -1, qualunque altro numero naturale
pointstyle "Round", "RoundEmpty", "Rectangular", "RectangularEmpty", "Cross"
linestyle "SolidLine", "DashLine", "DashDotLine", "DashDotDotLine", "DotLine"
color "#0000ff", qualunque altra stringa nel formato ``#rrggbb'' dove: rr, gg, bb sono tre numeri esadecimali di due cifre che indicano rispettivamente le componenti rossa, verde, blu del colore

Python mette a disposizione molti modi per passare i parametri ad una funzione e pykig.py ne aggiunge altri per modificare i suoi attributi o il comportamento predefinito.

4.1 Argomenti per posizione

Nei costruttori dei diversi oggetti i parametri sono scritti in un ben preciso ordine, sempre lo stesso. e possono essere riempiti con argomenti passati nello stesso ordine. A esempio se voglio un "punto" di coordinate (2; 3), rosso, grande, di nome Pippo, rotondo, posso crearlo con la seguente istruzione:

a=Point(2, 3, VISIBLE, "Pippo", False, 20, "Round", "Solidline", "#ff0000")

Così, un "segmento" che congiunge i punti a e b, largo 4, verde, tratteggiato, di nome "Pluto", lo creo con la seguente istruzione:

s=Segment(a, b, VISIBLE, "Pluto", False, 4, "Round", "DashLine", "#00ff00")

Questo meccanismo è comodo se devo passare pochi argomenti e questi sono i primi della lista. Ad esempio se voglio costruire due punti e un segmento invisibili posso dare il comando:

a=Point(-2, 1, HIDDEN)
b=Point(3, 3, HIDDEN)
s=Segment(a, b, HIDDEN)

Questo meccanismo presenta alcuni inconvenienti:

Per superare questi problemi possiamo utilizzare il seguente metodo.

4.2 Argomenti per nome

Python mette a disposizione un modo di passare argomenti ad una funzione secondo la seguente sintassi:

  nomefunzione(un_parametro=un_argomento, altro_parametro=altro_argomento)

Così se voglio costruire un "punto" grosso rosso, un altro grosso verde uniti da un segmento grosso giallo:

a=Point(-2, 1, width=10, color="#ff0000")
b=Point(3, 3, width=10, color="#00ff00")
s=Segment(a, b, width=5, color="#ffff00")

4.3 Argomenti predefiniti

pykig.py ci mette a disposizione anche un altro strumento utile in certi casi, ci dà la possibiltà di modificare il comportamento predefinito. Supponiamo, ad un certo punto della nostra costruzione di dover disegnare tutti elementi con un certo argomento, ad esempio voglio che i prossimi argomenti siano tutti interni, cioè mi servono solo per la costruzione di altri elementi e non devono essere visualizzati. Ad esempio se voglio disegnare un triangolo verde, ma senza che siano presenti i vertici:

a=Point(-2, 1, internal=True)
b=Point(3, -3, internal=True)
c=Point(2, 3, internal=True)
Segment(a, b, color="#00ff00")
Segment(b, c, color="#00ff00")
Segment(c, a, color="#00ff00")

Se gli elementi sono molti, la faccenda può risultare piuttosto noiosa, è possibile modificare il comportamento predefinito di pykig.py con il usando i metodi dell'oggetto kigdocument. Il precedente problema può essere risolto in questo modo:

kigdocument.setinternal(True)
a=Point(-2, 1)
b=Point(3, -3)
c=Point(2, 3)
kigdocument.setinternal(False)
kigdocument.setcolor("#00ff00")
Segment(a, b)
Segment(b, c)
Segment(c, a)

4.4 Metodi dell'oggetto

pykig.py fornisce un quarto modo per determinare il valore degli attributi dei suoi oggetti: usanre un metodo dell'oggetto stesso. Questo modo permette di separare la costruzione dell'oggetto dalla definizione dei suoi attributi. Problema: realizzare un triangolo con vertici e lati di larghezza maggiore del normale colori casuali.

Python ha un modulo apposito dedicato alla generazione di numeri casuali: random utilizzandolo possiamo scrivere una funzione che produce una stringa che rappresenta un colore casuale:

import random

def coloreacaso():
  return "#%x%x%x" % (random.randrange(256), 
                      random.randrange(256), 
                      random.randrange(256))
a=Point(-2, 1)
b=Point(3, -3)
c=Point(2, 3)
l1=Segment(a, b)
l2=Segment(b, c)
l3=Segment(c, a)
for e in (a, b, c, l1, l2, l3):
  e.setcolor(coloreacaso())

L'unico attributo che non possiamo cambiare dopo aver creato un oggetto è l'attributo internal, Quindi se vogliamo che un oggetto sia interno dobbiamo deciderlo prima di costruire l'oggetto stesso. Ognuno dei metodi precedenti ha vantaggi e svantaggi nei termini di sinteticità e di chiarezza, sta al programmatore scegliere caso per caso, il metodo più adatto.

Visto come determinare gli attributi degli oggetti pykig.py vediamo quali oggetti pykig.py ci permette di creare.