Prima di tutto, è necessario comprendere che lo __getitem__
è zucchero sintattico. È bello avere, ma se non ne hai bisogno, non usarlo. __getitem__
e __setitem__
sono fondamentalmente, se si vuole essere in grado di accedere agli elementi del tuo oggetto utilizzando la notazione staffa come:
p= Particle(foo)
bar = p[0]
se non c'è bisogno di questo, non ti preoccupare.
Ora, su tutto il resto. Sembra che tu abbia le caratteristiche principali che vuoi che il tuo oggetto abbia a portata di mano nella tua definizione __init__
, che va bene. Ora è necessario legare in realtà questi valori sul vostro oggetto utilizzando self
:
class Particle:
def __init__(self, mass, position, velocity, force):
self.mass = mass
self.position = position
self.velocity = velocity
self.force = force
Questo è davvero. È ora possibile accedere a questi valori usando la notazione punto, in questo modo:
mass,pos,vel,f = 0,0,0,0 # just for readability
p = Particle(mass,pos,vel,f)
print p.mass, p.position, p.velocity, p.force
Una delle cose belle che abbiamo uscire da questo è che se chiediamo pitone cosa p
è, vi dirà che si tratta di un caso di il tipo Particle
, in questo modo:
in [1]: p
out[1]: <__main__.Particle instance at 0x03E1fE68>
In teoria, quando si lavora con gli oggetti come questo si vuole che ci sia un "livello di astrazione" tra l'utente ei dati tali che non accedono o manipolare i dati direttamente. Per fare questo, puoi creare funzioni (come hai provato a fare con __getitem__
) per mediare le interazioni tra l'utente e i dati attraverso i metodi di classe. Questo è bello, ma spesso non è necessario.
Nel tuo caso più semplice, per aggiornare i valori di questi attributi, si può solo farlo direttamente allo stesso modo in cui li si accede, con la notazione dot:
in [2]: p.mass
out[2]: 0
in [3]: p.mass = 2
in [4]: p.mass
out[4]: 2
Potreste aver capito questo già, ma non c'è nulla di magico nella funzione __init__
, o anche nella definizione class
(in cui dovresti/dovresti generalmente definire la maggior parte degli attributi e dei metodi della tua classe). Alcuni tipi di oggetti sono piuttosto permissivi e ti permettono di aggiungere attributi quando e dove vuoi. Questo può essere conveniente, ma in genere è molto hacky e non è una buona pratica. Non sto suggerendo di farlo, solo dimostrandoti che è possibile.
in [5]: p.newattr ='foobar!'
in [6]: p.newattr
out[6]: 'foobar!'
Strano, vero? Se questo ti fa accapponare la pelle ... beh, forse dovrebbe. Ma è possibile, e chi sono io per dire ciò che puoi o non puoi fare. Quindi questo è un assaggio di come funzionano le classi.
questo funziona per me come è. – askewchan
Tutte le definizioni '__getitem__' sono identiche. È necessario verificare quale oggetto viene effettivamente recuperato. –
@askewchan Non dovrebbe. –