Po pierwsze, powinieneś zrozumieć, że __getitem__
jest cukrem syntaktycznym. Fajnie jest mieć, ale jeśli go nie potrzebujesz, nie używaj go. __getitem__
i __setitem__
są w zasadzie, jeśli chcesz mieć dostęp do pozycji z Twojego obiektu za pomocą notacji nawiasu jak:
p= Particle(foo)
bar = p[0]
jeśli nie trzeba do tego, nie martw się o to.
Teraz wszystko inne. Wygląda na to, że masz główne cechy, które obiekt ma nosić w swojej definicji __init__
, co jest w porządku. Teraz trzeba rzeczywiście wiążą te wartości na Twój obiekt za pomocą self
:
class Particle:
def __init__(self, mass, position, velocity, force):
self.mass = mass
self.position = position
self.velocity = velocity
self.force = force
To naprawdę on. Możesz teraz uzyskać dostęp do tych wartości za pomocą notacji kropki, tak jak poniżej:
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
Jedną z miłych rzeczy możemy wydostać się z tego, że jeśli pytamy pytona co p
jest, powie to, że jest to instancja typ Particle
, tak:
in [1]: p
out[1]: <__main__.Particle instance at 0x03E1fE68>
teoretycznie podczas pracy z obiektami, jak to chcesz tam być „warstwę abstrakcji” pomiędzy użytkownikiem, a dane w taki sposób, że nie korzysta lub manipulować dane bezpośrednio. Aby to zrobić, tworzysz funkcje (jak próbujesz zrobić z __getitem__
) w celu pośredniczenia w interakcjach między użytkownikiem a danymi za pomocą metod klasy. To jest miłe, ale często nie jest konieczne.
W swojej prostszej przypadku aktualizacji wartości tych atrybutów, można po prostu zrobić to bezpośrednio w ten sam sposób możemy je dostępnego z notacji dot:
in [2]: p.mass
out[2]: 0
in [3]: p.mass = 2
in [4]: p.mass
out[4]: 2
Mogłeś zdobione to już, ale nie ma nic magicznego w funkcji __init__
, ani nawet w definicji class
(gdzie ogólnie powinieneś/powinnaś definiować większość atrybutów i metod twojej klasy). Niektóre rodzaje obiektów są dość permisywne, jeśli chodzi o umożliwienie dodawania atrybutów, kiedy tylko chcesz. Może to być wygodne, ale generalnie jest bardzo hackowskie i nie jest dobrą praktyką. Nie sugeruję, że to robisz, tylko pokazujesz, że to możliwe.
in [5]: p.newattr ='foobar!'
in [6]: p.newattr
out[6]: 'foobar!'
Dziwne, prawda? Jeśli to sprawi, że twoja skóra się czołgnie ... cóż, może powinna. Ale jest to możliwe i kim jestem, aby powiedzieć, co możesz i czego nie możesz zrobić. To jest sposób na to, jak działają zajęcia.
to działa na mnie jak jest. – askewchan
Wszystkie twoje definicje "__getitem__" są tą samą metodą. Musisz sprawdzić, który element jest faktycznie pobierany. –
@askewchan Nie powinno. –