Python >> Tutoriel Python >  >> Python

Attributs statiques et dynamiques en Python - Quelle est la différence ?

Réponse rapide :Les attributs statiques sont des variables définies une fois pour la classe et partagées par toutes les instances. Les attributs dynamiques sont des variables définies pour des instances individuelles uniquement. Les variables statiques sont utilisées comme "repli" lorsqu'il n'y a pas d'attributs dynamiques explicites définis pour les instances. Lorsque vous essayez de "remplacer" un attribut statique tel que dans x.attr = 1 , vous créez en fait un attribut dynamique sur cette instance qui vit séparément de tout attribut statique X.attr pour la classe X .

Vous venez de tomber sur les termes "attributs statiques" et "attributs dynamiques" et je me suis demandé ce qu'ils voulaient dire et quelle était la différence entre eux est de toute façon? Cet article résoudra ce problème une fois pour toutes. Alors, commençons !

Vous pouvez également regarder ma vidéo explicative pendant que vous lisez l'article restant :

httpv://www.youtube.com/watch?v=embed/r01HNvaAHbk

Attributs statiques et dynamiques en Python :quelle est la différence ?

En étudiant cette question, vous améliorerez votre compréhension de la programmation orientée objet. Alors, décomposons cette question en deux questions plus simples :

  • Que sont les attributs statiques ?
  • Que sont les attributs dynamiques ?

Que sont les attributs statiques en Python ?

? Attributs statiques sont des variables associées à une classe donnée et partagées entre toutes les instances. Si vous modifiez la valeur d'un attribut statique, toutes les instances verront ce changement. Considérez-les comme des variables partagées .

Voici un exemple simple :

class Book:
    # static attribute / class attribute
    classification = "textual"

coffee_break_python = Book()
hitchhikers_guide = Book()

print(Book.classification)
# textual
print(coffee_break_python.classification)
# textual
print(hitchhikers_guide.classification)
# textual

Dans le code, nous définissons l'attribut statique classification pour la classe Book . Vous pouvez accéder à cet attribut non seulement via le nom de classe Book mais aussi via les instances coffee_break_python et hitchhikers_guide .

Pensez-y de cette façon :les variables d'instance n'ont pas leur propre attribut classification . Par conséquent, l'interpréteur essaie de résoudre ce problème en regardant vers le haut la hiérarchie des classes pour trouver la première définition de l'attribut demandé classification . Il trouve ensuite l'attribut au niveau de la classe.

? Pourquoi sont-ils appelés "statiques" dans l'orientation objet ? Parce qu'ils sont alloués en mémoire "statiquement" pour toute l'exécution du programme - avant même que le premier objet ne soit créé.

Ok, vous êtes maintenant prêt à résoudre un casse-tête rapide en supposant les définitions ci-dessus :

## Puzzle 1
Book.classification = "video"
print(hitchhikers_guide.classification)

Quel est le résultat de ce puzzle ? Engagez-vous d'abord sur la réponse avant de continuer à lire.

Très probablement, vous avez trouvé la bonne réponse. L'extrait de code modifie la valeur de l'attribut de classe. L'instance de classe hitchhikers_guide n'a pas sa propre définition de classification , il prête donc la définition de l'attribut class. Le résultat est donc video .

Jetons un coup d'œil à ce casse-tête :

## Puzzle 2
Book.classification = "text"
hitchhikers_guide.classification = "audio"
print(coffee_break_python.classification)

Quel est le résultat maintenant ? Verrouillez votre réponse en premier, avant de continuer à lire. L'avoir? Bien, alors voyons si vous avez bien deviné.

Que se passe t-il ici?

  • Vous avez un attribut de classe statique.
  • Vous le modifiez au niveau de l'instance (en "audio").
  • Vous imprimez l'attribut class en l'appelant via une autre instance.

Le résultat est donc audio . N'est-ce pas ?

Mauvais !

Le résultat est text . Alors, pourquoi ?

Pour comprendre cela, vous devez comprendre le concept d'"attributs dynamiques" d'abord.

Que sont les attributs dynamiques en Python ?

? Attributs dynamiques en Python sont des attributs uniquement visibles au niveau de l'instance. Vous les définissez dynamiquement lors de l'exécution, c'est-à-dire après la création des instances. En Python, tout est un objet (même les fonctions). Vous pouvez donc définir un attribut d'instance dynamique pour presque tout.

Maintenant, saurez-vous résoudre l'énigme suivante ?

## Puzzle 3
class Universe:
    None

def answer():
    return 42

u = Universe()
u.answer = 21
answer.answer = 21

print(answer.answer + u.answer == answer())

Quel est le résultat de ce puzzle de code ?

Déroutant, je sais. Mais engagez-vous d'abord sur votre "réponse".

Dans le puzzle, on crée deux objets :le Universe objet affecté au nom u et l'objet fonction affecté au nom answer .

(Ne débattons pas (pour l'instant) si une classe est aussi un objet…;))

Pour les deux objets, nous créons un attribut dynamique answer .

? La différence avec l'attribut static est que nous le définissons au moment de l'exécution pour les objets eux-mêmes et non statiquement pour la classe.

C'est la réponse à la question posée dans cet article.

La classe Universe et toutes les autres instances potentielles de cette classe ne connaissent pas l'attribut answer . Il n'est défini que pour l'instance u et l'instance answer . C'est tout.

Au fait :le résultat pour l'énigme 3 est True .

Mais plus important encore, nous pouvons maintenant comprendre pourquoi Puzzle 2 produit le résultat audio et non text :

Book.classification = "text"
hitchhikers_guide.classification = "audio"
print(coffee_break_python.classification)

La première ligne parle de l'attribut statique de la classe. Il s'agit de l'attribut par défaut si une instance n'a pas défini son propre attribut.

La deuxième ligne parle de l'attribut dynamique de l'instance hitchhikers_guide . Il n'est défini que pour cette instance. Donc le livre coffee_break_python , n'hésitez pas à en savoir plus sur le Coffee Break Python série ici, ne sait rien de l'attribut dynamique de l'autre livre. Il ne connaît que l'attribut statique du Book classe.

Résumé

Pour résumer, vous avez appris la différence entre les attributs statiques et dynamiques en Python . Les attributs statiques sont définis une seule fois pour la classe - et sont utilisés comme "repli" au cas où aucun attribut dynamique explicite n'est défini pour les instances. Dès que vous essayez d'"écraser" un attribut statique attr en l'appelant l'instance x comme dans x.attr = 1 , vous créez en fait un attribut dynamique sur cette instance qui vit séparément de tout attribut statique X.attr pour la classe X .

(Avis de non-responsabilité :je sais que le terme "attribut statique" n'est pas si courant en Python, mais je l'ai trouvé assez utile pour expliquer les choses.)