Supposons que je l'objet suivant:liste Python, le nom de l'objet de recherche, conseils d'efficacité
class Foo(object):
def __init__(self, name=None):
self.name = name
def __repr__(self):
return self.name
Et une liste contenant plusieurs instances, telles que:
list = [Foo(name='alice'), Foo(name='bob'), Foo(name='charlie')]
Si je veux trouver un objet avec un nom donné, je pouvais utiliser ce qui suit:
def get_by_name(name, list):
return [foo for foo in list if foo.name == name][-1]
ce qui serait évidemment dire:
print get_by_name('alice', list)
>> alice
Cependant, existe-t-il une structure de données ou un procédé plus efficace pour extraire de tels objets? En réalité, les noms d'objets ne sont connus qu'à l'exécution et pourraient en théorie changer tout au long du cycle de vie de l'objet.
Un conseil?
MISE À JOUR:
Merci à Matt menuisiers réponse, j'ont mis à jour pour soutenir plusieurs de Foo avec le même nom:
class Foo(object):
_all_names = {}
def __init__(self, name=None):
self._name = None
self.name = name
@property
def name(self):
return self._name
@name.setter
def name(self, name):
if self._name is not None:
self._all_names[self._name].remove(self)
self._name = name
if name is not None:
self._all_names.setdefault(name, []).append(self)
@classmethod
def get_by_name(cls, name):
return cls._all_names[name]
def __repr__(self):
return "{0}".format(self.name)
l = [Foo("alice"), Foo("bob"), Foo('alice'), Foo('charlie')]
print Foo.get_by_name("alice")
print Foo.get_by_name("charlie")
Les commentaires sur cette approche?
Un objet avec un prénom ou un * Foo *? –
Voir ma mise à jour à la question. – epoch
Voir ce que vous en pensez maintenant. –