[Python] exporting di classi

Federico Tomassini effetom a gmail.com
Ven 1 Dic 2006 13:43:21 CET


Ciao a tutti,

ho un dubbio sui python internal.
Ecco la situazione; ho due classi:

###
class Foo:
   def __init__(self):
    self.x= 0
   def inc(self):
    self.x+= 1

class Bar:
   def __init__(self):
    self.x= 0

foo=Foo()
bar=Bar()
###

Poi, eseguo cio' che chiamo un'exporting di classe:

###
attr= getattr(foo, 'inc')
setattr(bar, 'inc', attr)
###

In questo modo la classe `bar` avra' il metodo 'inc',
richiamabile tramite `self.inc`.

Se a questo punto qualcuno si chiedesse perche' non
eredito, la risposta e' la seguente: l'ereditarieta'
costringe, per ogni classe, a inizializzare un nuovo
padre; queso in genere non e' un problema, ma nel mio
caso voglio che le mie classi utilizzino tutte lo
*stesso padre*, e non un' istanza ciascuna.

A questo punto, ecco cosa succede:

###
  >>> bar.inc()
  >>> bar.x
0
  >>> foo.x
1
  >>>
###

In pratica, il metodo inc e' stato chiamato con
self=foo, non self=bar, nonostante la classe chiamante
sia a tutti gli effetti bar.

Mi chiedo:

1- Come viene inizializzato il self? Pensavo che
venisse valorizzato in relazione alla classe chiamante,
ma quanto sopra dimostra che non e' cois'

2- Come potrei ottenere l'effetto desiderato in maniera
elegante? l'obiettivo e' quello di ottenere bar.x=1 e
foo.x=0. Una soluzione e' quella di modificare il
metodo inc:
###
   def inc(self, c):
    c.x+= 1
###
e poi chiamare:
###
bar.inc(bar)
###
ma questo e' abbastanza trash.

Ogni idea e' ben accetta
Ciao

--
efphe






Maggiori informazioni sulla lista Python