Python >> Tutoriel Python >  >> Python

Comment créer des objets en ligne avec des propriétés ? [Python One-Liner]

Problème :Comment créer un objet Python en une seule ligne de code ? Et comment associer des propriétés personnalisées à cet objet dans la même ligne ?

Exemple  :Supposons que vous vouliez faire quelque chose comme cet extrait de pseudo-code :

var newObject = new({'property' : 'value' })
newObject.property # returns 'value'

Cependant, vous ne pouvez pas faire la même chose en Python car cela créerait un dictionnaire :

new_object = {'property': 'value'}
new_object.property
# raises an AttributeError

Cela lève un AttributeError car il n'y a pas d'attribut property associé à l'objet dictionnaire. Pour accéder à la clé du dictionnaire dans ce cas, vous devez utiliser la syntaxe new_object['property'] .

Alors, comment créer un objet Python en ligne avec des attributs dans une seule ligne de code Python ?

Voici un bref aperçu de nos trois méthodes :

Exercice :Les trois méthodes produisent-elles le même résultat ? Exécutez le code pour le tester !

Plongeons-nous plus en détail dans chacune de ces méthodes !

Méthode 1 :Utiliser la fonction intégrée type() de Python

Le type(name, bases, dict) La fonction crée et renvoie un nouvel objet. Il prend trois arguments qui permettent de personnaliser l'objet :

  • name :il s'agit du nom de classe du nouvel objet. Il devient le name attribut, afin que vous puissiez utiliser object.name pour accéder à la valeur de l'argument.
  • bases :il s'agit d'un tuple d'une ou plusieurs valeurs de tuple qui définit les classes de base. Vous pouvez accéder au contenu via le object.bases attribut de l'objet nouvellement créé.
  • dict :il s'agit de l'espace de noms avec les attributs de classe et les définitions de méthodes. Vous pouvez créer des attributs et des méthodes personnalisés ici. Au cas où vous voudriez accéder aux valeurs plus tard, vous pouvez utiliser le object.__dict__ attribut sur l'objet nouvellement créé.

Voici comment utiliser la fonction type() pour créer un nouvel objet avec des attributs sur une seule ligne de code :

obj = type('obj', (object,), {'property': 'value'})

Voyons comment accéder à la propriété d'attribut de l'objet nouvellement créé :

>>> obj
<class '__main__.obj'>
>>> obj.property
'value'

Ça marche! La classe créée a un attribut associé property qui est réglé sur 'value' .

Cependant, ce n'est pas encore une instance (ou un objet). Ce n'est qu'une définition de classe. Pour créer réellement une instance, vous devez utiliser la méthode suivante avec une paire de parenthèses à la fin.

obj = type('obj', (object,), {'property': 'value'})()

Maintenant, vous pouvez créer un nombre arbitraire d'instances.

Méthode 2 :Fonction Lambda sans valeur de retour + attributs dynamiques

La deuxième méthode est moins propre - c'est plus un hack - mais ça marche à merveille ! L'idée est de créer une fonction anonyme en utilisant le mot-clé lambda et d'y associer les attributs souhaités juste après :

>>> obj = lambda: None
>>> obj.property = 'value'
>>> obj.property
'value'

Vous pouvez également le mettre en ligne en utilisant le point-virgule :

obj = lambda: None; obj.property = 'value'

Cela permet d'obtenir le résultat souhaité et n'utilise qu'une seule ligne de code Python !

Méthode 3 :Utiliser les tuples nommés du module Collections

Vous pouvez également utiliser des tuples nommés du module collections.

from collections import namedtuple

obj = namedtuple('obj', ['property'])('value')
print(obj.property)

La sortie résultante est la valeur de propriété 'value' .

  • La première partie de l'expression namedtuple('obj', ['property']) vous permet de créer un nouvel objet en utilisant le obj(...) constructeur.
  • La deuxième partie de l'expression associe la chaîne 'value' à l'attribut tuple 'property' .