la finale de " mot équivalent pour les variables en Python?
Je n'arrivais pas à trouver de la documentation sur un équivalent de Java final
en Python, est-il une telle chose?
Je suis de la création d'un instantané d'un objet (utilisé pour la restauration, si quelque chose tombe en panne); une fois cette sauvegarde variable est assignée, il ne devrait pas être modifiée -- un final comme fonction en Python serait bien pour cette.
- double possible de la Création constante en Python
- En général. l'absence de l'immuabilité est désastreux.. prouve que Python n'est pas adapté pour les grandes applications multithread.
- Alors que je suis d'accord que Python n'est pas adapté pour ça, il y a des n-uplets et frozenset de la bibliothèque standard, et MagicStack/immutables est une implémentation d'une mutable cartographie qui sera proposé d'ajouter à la bibliothèque standard ainsi.
Vous devez vous connecter pour publier un commentaire.
Avoir une variable en Java être
final
signifie qu'une fois que vous affecter à une variable, vous ne pouvez pas réaffecter cette variable à point à un autre objet. Il ne fait signifie pas que l'objet ne peut pas être modifié. Par exemple, le code Java suivant fonctionne parfaitement bien:mais la suite ne serait même pas compiler:
Si votre question est de savoir si
final
existe en Python. Il ne le fait pas.Cependant, Python n'ont immuable des structures de données. Par exemple, alors que vous pouvez muter un
list
, vous ne pouvez pas muter untuple
. Vous pouvez muter unset
mais pas unfrozenset
, etc.Mon conseil serait de ne pas m'en inquiéter respect des obligations de non-mutation au niveau du langage et de simplement se concentrer sur assurez-vous de ne pas écrire du code qui transforme ces objets une fois qu'ils sont affectés.
simply concentrate on making sure that you don't write any code which mutates these objects after they're assigned
. Comment allez-vous communiquer à d'autres personnes? Ou de votre soi futur? Avec un commentaire ou une docstring? Un langage formel construction est beaucoup moins volatile qu'un commentaire. Python manque c'est, en effet, inquiétant.Il n'y a pas de
final
équivalent en Python.Mais, pour créer des champs en lecture seule d'instances de la classe, vous pouvez utiliser le propriété fonction.
Modifier: peut-être vous voulez quelque chose comme ceci:
self.__dict__[attr] = value
avecreturn super(WriteORW, self).__setattr__(attr, value)
Un attribuez-une fois que la variable est un problème de conception. De la conception de votre application de sorte que la variable est définie une fois et une fois seulement.
Toutefois, si vous souhaitez au moment de l'exécution de la vérification de votre conception, vous pouvez le faire avec un wrapper autour de l'objet.
C'est maladroit, mais il permet de détecter les problèmes de conception au moment de l'exécution.
Il n'y a pas une telle chose. En général, le Python attitude est "si vous ne voulez pas que cette modification, il suffit de ne pas le modifier". Les Clients d'une API est rare à juste promenez-vous autour de votre sans-papiers internes de toute façon.
Vous pourriez, je suppose, contourner cela en utilisant les n-uplets ou namedtuples pour les bits de votre modèle, qui sont par nature immuable. Ce n'est pas pour aider avec une partie de votre modèle qui doit être mutable bien sûr.
Python n'a pas d'équivalent de "finale". Il n'a pas de "public" et "protégée", sauf par convention de nommage. Ce n'est pas que "bondage et discipline".
Python 3.8 (via PEP 591) ajoute
Final
les variables, les fonctions, les méthodes et les classes. Voici quelques façons de l'utiliser:@final
Décorateur (classes, méthodes)Final
annotationvous pouvez simuler quelque chose comme ça à travers le descripteur de protocole, car il permet de définir la lecture et de définition d'une variable de la façon dont vous le souhaitez.
http://code.activestate.com/recipes/576527/ définit une fonction freeze, bien que cela ne fonctionne pas parfaitement.
Je considère simplement laisser mutable bien.
À compter de 2019 et PEP 591, Python est un
Final
type. Il ne sera pas disponible dans la bibliothèque standard jusqu'à la sortie de Python 3.8, mais jusqu'alors, vous pouvez l'utiliser via le la saisie des extensions de la bibliothèque. Il ne fonctionne pas commefinal
fonctionne en Java bien que Python est encore un typées dynamiquement de la langue. Mais si vous l'utilisez avec un type statique checker comme mypy il vous donnera de très prestations similaires.Il y a aussi un
final
décorateur qui peuvent être appliquées pour marquer les méthodes de la classe comme définitive et de l'empêcher d'être remplacé. Là encore, c'est seulement vérifié à la "compilation", de sorte que vous devrez inclure un type statique pion dans votre flux de travail.Bien que c'est une vieille question, j'ai pensé que je voudrais ajouter encore une autre option: Vous pouvez également utiliser
assert
pour vérifier une variable est définie pour ce que vous avez initialement prévu pour être fixé à une double vérification, si vous voulez. Bien que ce n'est pas le même quefinal
en Java, il peut être utilisé pour créer un effet similaire:Comme vu ci-dessus, si
PI
ont été pour une raison quelconque n'est pas définie à3.14
, unAssertionError
serait jeté, donc untry/except
bloc serait probablement un bon plus. Peu importe, il peut venir dans la pratique en fonction de votre situation.Python, en effet, ne dispose pas d'un type final, il n'ont immuable types, tels que les n-uplets, mais c'est autre chose.
Certains des autres Réponses ici les classes de plein de pseudo variables final et je préfère ma classe à seulement quelques types, donc je vous suggère d'utiliser un descripteur de créer la finale type:
Si vous utilisez cette classe comme ceci:
Alors vous ne serez pas en mesure de définir cette variable dans toute instance de cette classe.
Malheureusement, comme avec le WriteOnceReadWhenever de réponse, vous pouvez toujours définir la variable de classe.