[PIPython] Membri di classe e membri di oggetto (lungo)

Andrea Giammarchi andrea
Mer 30 Mar 2005 14:44:55 CEST


Luca Fabbri wrote:

>Per chi ne ha voglia...
>  
>
Incuriosito da questa discussione ho appena fatto un file di prova,
molto semplice e spero utile per scharirti le idee su cme Python
"gestisce in modo dinamico se stesso" ... se ci sono caXXate, vi
pregherei di spiegare anche a me cosa c'e' che non va o cosa c'e' di
preciso dietro questo comportamento.
Grazie,
    Andrea Giammarchi

________________________________________________________

# TEST PER VARIABILI STATICHE DINAMICHE PRIVATE PUBBLICHE DI OGGETTI E
CLASSI
# COPIARE ED INCOLLARE PER IL TEST, LEGGERE PER CAPIRCI DI PIU' ....
SPERO ...

class MyClass:

    # variabili statiche, private e pubbliche
    globale_statica = 5;
    __privata_statica = 5;

    # costruttore
    def __init__( self ):
        self.interna_dinamica = 5;
        self.__privata_dinamica = 5;

    # metodo pubblico per prelevare la privata statica
    def getPrivataStatica( self ):
        return MyClass.__privata_statica

    # metodo pubblico per settare la privata statica
    def setPrivataStatica( self, number ):
        MyClass.__privata_statica = number

    # metodo pubblico per prelevare la privata dinamica
    def getPrivataDinamica( self ):
        return self.__privata_dinamica

    # metodo pubblico per settare la privata dinamica
    def setPrivataDinamica( self, number ):
        self.__privata_dinamica = number


# ISTANZIO OGGETTO a ED OGGETTO b
a = MyClass()
b = MyClass()


# STAMPO TUTTE LE VARIABILI DI A
print a.globale_statica # sara' 5
# print a.__privata_statica => errore
print a.getPrivataStatica() # sara' 5

print a.interna_dinamica # sara' 5
# print a.__privata_dinamica => errore
print a.getPrivataDinamica() # sara' 5

# STAMPO TUTTE LE VARIABILI DI B
print a.globale_statica # sara' 5
print a.getPrivataStatica() # sara' 5
print a.interna_dinamica # sara' 5
print a.getPrivataDinamica() # sara' 5

# SETTO LA STATICA PUBBLICA DI MyClass
MyClass.globale_statica = 7
# a E b adesso hanno la globale_statica della classe a 7 ...

# CONTROLLO SIA a CHE b ( entrambi avranno 7 )
print a.globale_statica # sara' 7
print b.globale_statica # sara' 7

# SETTO LA PRIVATA STATICA TRAMITE L' OGGETTO a
# ( non si puo' tramite MyClass.__privata_statica = ... e' privata )
a.setPrivataStatica( 11 )
# definiamo tramite il metodo di a la statica privata di MyClass ...

# CONTROLLO SE LA VARIABILE STATICA SETTATA TRAMITE a
# SIA EFFETTIVAMENTE STATICA NELLA CLASSE ( tramite print su b )
print b.getPrivataStatica() # sara' 11

# SETTO SU b LA SUA INTERNA DINAMICA
b.setPrivataDinamica( 13 )
# cambiamo valore a quella interna dinamica ...

# CONTROLLO SU a ...
print a.getPrivataDinamica() # invariato, sara' 5

# E MI ACCERTO PER b ...
print b.getPrivataDinamica() # ovviamente sara' 13

# CAMBIO SU a LA DINAMICA PUBBLICA
a.interna_dinamica = 21

# E CONTROLLO SU ENTRAMBI ...
print a.interna_dinamica # sara' 21, l' abbiamo appena assegnato
print b.interna_dinamica # sara' 5, nessun cambiamento per l' oggetto b

# SETTO UN' ULTIMA VOLTA LA STATICA GLOBALE SU b
b.globale_statica = 51 # attenzione ...
# abbiamo appena detto a b di fregarsene della statica globale
# e di 'appropriarsi' della variabile globale_statica
# che a questo punto avra' un riferimento all' oggetto
# e non alla classe ...

# E CONTROLLO SU a E b
print a.globale_statica # come prima, 7
print b.globale_statica # come assegnato, 51

# ma se era statica perche' sono diverse ??? ..
MyClass.globale_statica = 3
# assegno 3 alla variabile globale_statica della classe MyClass

print a.globale_statica # sara' 3 ... come da manuale
print b.globale_statica # sara' 51, addio riferimenti alla classe,
benvenuto oggetto b

# PER CONCLUDERE ...
"""
se andiamo a pescare la statica tramite l' oggetto, questa si assegna
all' oggetto stesso
mentre se passiamo sempre per la classe l' oggetto non ha riferimenti
propri alla variabile interna
"""



More information about the Python mailing list