Forum >> Principianti >> [LUNGO] Accesso a lista di oggetti

Pagina: 1

Ciao a tutti,



supponiamo di avere tre classi così definite:




# class that identify a single person

class Person(object):

	def __init__(self, name, surname, email):

		self.name = name

		self.surname = surname

		self.email = email







#class that allow iteration of class People

class PeopleIterator(object):

	def __init__(self, people_list):

		self._iterable = people_list

		self._index = 0




	def __next__(self):

		if self._index < (len(self._iterable.list)):

			result = self._iterable.list[self._index]

			self._index += 1

			return result

		raise StopIteration




		

#class that identify a list of person

class People(object):

	def __init__(self):

		self.list = []




	def add(self, obj):

		self.list.append(obj)




	def __iter__(self):

		return PeopleIterator(self)




	def __len__(self):

		return len(self.list)









Con le tre classi così fatte, riesco a fare questo tipo di cose:




amici = People()




mario = Person("Mario", "Rossi", "mario.rossi@mail.com")

amici.add(mario)




alberto = Person("Alberto", "Verdi", "alberto.verdi@mail.com")

amici.add(alberto)




for amico in amici:

	print(amico.email)









quello che vorrei riuscire a poter fare sono cose del tipo:




if amici["mario.rossi@mail.com"] is not None:

	print(amici["mario.rossi@mail.com"].name)







guido = amici["guido.neri@mail.com"]

if guido is None:

	print("Guido non è tuo amico")








in pratica cercare all'interno della mia collection di oggetti per un attributo dell'oggetto contenuto




Non so se sia possibile farlo, ho cercato parecchio ma non ho trovato nulla che mi permetta di implementarlo.




Grazie in anticipo




Giuseppe Garzotto



non capisco perché ti stai dando così tanto da fare per reinventare una banale lista Python. Poi fare semplicemente qualcosa come:

>>> paolo = Person('Paolo', 'Rossi')
>>> mario = Person('Mario', 'Bianchi')
>>> giuseppe = Person('Giuseppe', 'Verdi')
>>> amici = [paolo, mario, giuseppe]
>>> for amico in amici:
        print(amico.name)
'Paolo'
'Mario'
'Giuseppe'
>>> amici.remove(mario)
>>> mario in amici
False
>>> if giuseppe in amici:
        print(giuseppe.surname)
'Verdi'
e così via.


Una lista Python ha già tutte le proprietà che vuoi... basta usare quella.


Poi certo, la tua domanda da un punto di vista teorico è sensata, e ha una risposta. Solo, non ti serve niente di tutta questa struttura che ti stai facendo.

Quello che ho postato è una cosa simile a quello che mi serve in realtà.
Sostanzialmente da una chiamata API ricevo una stringa, e sulla base di questa stringa dovrei reperire una serie di parametri che mi permettono di reperire delle informazioni da database.

Ho pensato di organizzare questi parametri come una collection di oggetti, da qui la mia domanda.




Banalmente potevo anche usare un ciclo for..in e interrompere con break quando trovavo quello che mi serviva, volevo vedere se c'era un modo più elegante.




Essendo relativamente nuovo in Python ho ancora in testa un modo di programmare non pythonico, da qui le mie difficoltà.




Grazie comunque




Giuseppe



Non si capisce praticamente niente di quello che scrivi... che cosa vuol dire "organizzare i parametri come una collection di oggetti"? Mah.


Comuque una LISTA PYTHON è proprio una "collection di oggetti". Hai degli oggetti? Vuoi farne una "collection"? Bene! Mettili in una LISTA PYTHON!! pronto, facile, veloce, senza pensieri. Non c'è bisogno di reinventare la ruota.


>Banalmente potevo anche usare un ciclo for..in e interrompere con break quando trovavo quello che mi serviva
Ma no! Davvero, però, ti prego RILEGGI il codice che ti ho scritto. Perché è un po' noioso mettersi a scrivere del codice per te, e vedere che non lo hai nemmeno letto di sfuggita. Davvero, ti supplico, fallo per me, dai... RILEGGI quello che ho scritto... rileggilo con calma, senza farti distrarre da whatsapp... rileggilo... rileggilo.. ancora, ancora, ancora... dai...


Se vuoi sapere se un oggetto sta dentro una lista, non hai bisogno di percorre la lista finché lo trovi. Basta usare l'operatore "in", come ti ho mostrato nell'esempio che ho scritto. E che tu non hai letto.



Pagina: 1



Esegui il login per scrivere una risposta.