[Road to Intermediate] Comprendre les propriétés Python

Lien

[Road to Intermediate] Résumé du lien de l'article

introduction

Ceci est un résumé des «** Propriétés **» qui ne sont pas couvertes dans le Tutoriel Python.

J'écris actuellement du code de recherche en Python, mais je l'ai écrit correctement, donc c'est foiré. Par conséquent, je viserai un niveau intermédiaire de Python et viserai un code que tout le monde peut lire et comprendre.

Qu'est-ce qu'une propriété?

Qu'est-ce qu'une propriété en premier lieu? Les propriétés représentent les «données d'attribut / propriété d'objet».

... Je ne sais pas.

Par exemple, considérons la classe Player utilisée dans un jeu de tir en deux dimensions.

Instance de joueur pour se déplacer et dessiner dans les jeux de tir

--Coordonnées horizontales x

J'ai les informations de.

De cette manière, les données d'attribut / propriété de chaque instance sont appelées ** propriété **.

Essayez d'implémenter Player

Pour le moment, implémentons une classe Player normale.

Préparons une fonction de déplacement qui se déplace avec chaque coordonnée.

Le joueur a cette fois une plage mobile de $ 0 {\ leqq} x, y {\ leqq} 500 $ pour $ x et y $.

class Player:

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f'(x = {self.x}, y = {self.y})'

    def move(self, dx, dy):
        self.x += dx
        self.y += dy


"""
(x = 100, y = 100)
"""
player = Player(100, 100)
print(player)

"""
(x = 0, y = -100)
"""
player.move(-100, -200)
print(player)

Le code source ci-dessus fonctionne normalement et est simple. Cependant, en termes d'orientation objet, il y a quelques problèmes avec le code source ci-dessus.

Problème 1 Encapsulation

La classe ci-dessus peut être falsifiée avec les variables de propriété ** directement **.

Ce n'est pas en très bon état. En effet, il existe une possibilité de définir ou de modifier des variables peu pratiques.

En outre, l'orientation de base de l'objet est que l'état change en fonction de la méthode.

Problème 2 hors de portée

Je veux que cette classe Player s'exécute dans $ 0 {\ leqq} x, y {\ leqq} 500 $ pour $ x et y $. Cependant, la fonction de déplacement ci-dessus l'a rendu hors de portée.

Est-il possible de définir d'une manière ou d'une autre le processus pour qu'il reste dans la plage en même temps que la définition de la variable?

Propriété

Par conséquent, nous utiliserons la propriété de notation de Python.

Réécrivons le code source comme suit.

class Player:
    MIN_X = 0
    MAX_X = 500

    MIN_Y = 0
    MAX_Y = 500

    def __init__(self, x, y):
        self._x = x
        self._y = y

    def __repr__(self):
        return f'(x = {self.x}, y = {self.y})'

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, dx):
        self._x += dx
        self._x = max(0, min(self.MAX_X, self._x))

    @property
    def y(self):
        return self._y

    @y.setter
    def y(self, dy):
        self._y += dy
        self._y = max(0, min(self.MAX_Y, self._y))

    def move(self, dx, dy):
        self.x += dx
        self.y += dy


player = Player(100, 100)

player.move(-200, -200)

"""
(x = 0, y = 0)
"""
print(player)

Regardons le contenu un par un.

init

Dans celui-ci, les variables sont initialisées avec _x. Il semble que les variables que vous souhaitez gérer uniquement en interne sont souvent exprimées à l'aide de traits de soulignement tels que _x.

@property

@property
def x(self):
  return self._x

@property
def Nom de la variable publique externe(self):
retourne une variable interne

Ensuite, jetons un coup d'œil à x (self). Cela fonctionne comme une méthode, mais cela peut ressembler à une simple variable à l'extérieur de la classe. C'est pour ** renvoyer la valeur vers l'extérieur **.

C'est parce que nous utilisons la notation @ property ** decorator ** au-dessus de cette définition de fonction. Concernant les décorateurs, j'écrirai un autre article la prochaine fois.

Pour le moment, en ajoutant le mot-clé @property à une méthode, vous pouvez obtenir la valeur de l'extérieur de la classe avec ce nom de méthode.

@ Nom de la variable publique externe.

    @x.setter
    def x(self, dx):
        self._x += dx
        self._x = max(0, min(self.MAX_X, self._x))

    @Nom de la variable publique externe.setter
def Nom de la variable publique externe(self, dx):
        self.Variables internes+= dx
        self.Variables internes= max(0, min(self.MAX_X, self._x))

Le @property mentionné précédemment était un mot-clé pour obtenir et utiliser une valeur extérieure à la classe.

Cela signifie qu'il existe également des mots-clés qui donnent une valeur de l'extérieur et définissent la valeur à l'intérieur.

Utilisez le mot-clé @external public variable name.setter. Cela vous permet de définir la valeur en interne dans la notation habituelle.

La joie de la propriété

Quelle est la joie de la propriété?

En fait, les propriétés Python ont une forme différente de celle des autres langages. À l'origine, je touchais C #, C ++ et Java, donc j'étais assez surpris et mal à l'aise.

Les propriétés Python sont

--Pour l'extérieur, il peut être utilisé comme ** variables telles qu'elles apparaissent ** --Pour l'intérieur, vous pouvez masquer les variables importantes et écrire des traitements supplémentaires

Je suis heureux de le dire.

Dans d'autres langues

player.setValueA(50);

Il fallait le décrire sous la forme d'une fonction / méthode, pour ainsi dire, c'était ** redondant **.

En Python, en utilisant la spécification de langage propre aux langages dynamiques appelés décorateurs, Exposer des méthodes comme des variables à l'extérieur En interne, vous pouvez écrire des traitements supplémentaires.

Cependant, si vous écrivez trop de contenu compliqué dans le setter, cela deviendra un bogue et vous devrez en être conscient, il peut donc être nécessaire de rendre le contenu léger.

finalement

J'ai résumé les propriétés! Puisque je suis débutant, je pense qu'il y a beaucoup d'erreurs. Nous vous serions reconnaissants de bien vouloir nous donner vos conseils et opinions!

Recommended Posts

[Road to Intermediate] Comprendre les propriétés Python
Une route vers Python intermédiaire
[Route vers Python intermédiaire] Utiliser des opérateurs ternaires
[Route vers Python intermédiaire] Utiliser des expressions lambda
[Route vers Python intermédiaire] Résumé du lien de l'article
[Road to Intermediate] Python semble être tous des objets
[Route vers Python intermédiaire] Définir la fonction __getattr__ dans la classe
[Road to Intermediate Python] Définissez dans votre propre classe
[Road to Intermediate Python] Installer des packages en masse avec pip
[Python] Road to the Serpent (3) Classe Python
[Route vers Python intermédiaire] Utiliser l'instruction if dans la notation d'inclusion de liste
[Road to Intermediate Python] Permet des opérations de comparaison pour des classes uniques
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
[Python] Road to snakes (1) Construction de l'environnement
Mis à jour vers Python 2.7.9
Comprendre Python Coroutine
"Backport" vers python 2
[Python] La route du serpent (6) Manipuler les pandas
[Road to Intermediate] Que sont les * args, ** kwargs de Python?
Comment installer Python
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Réécrire le code Python2 en Python3 (2to3)
Comment installer python
Introduction au langage Python
Introduction à OpenCV (python) - (2)
Introduction de Python 2.7 à CentOS 6.6
La route vers Pythonista
Connectez python à mysql
La route vers Djangoist
[Road to Intermediate] Utiliser les variables de fonction intégrées de Python
En route vers l'acquisition de LPIC-1
[Python] Road to the Serpent (5) Jouez avec Matplotlib
Connectez-vous à BigQuery avec Python
[2020.8 dernière] Comment installer Python
[python] Convertir la date en chaîne
Publier de Python vers Slack
Comment installer Python [Windows]
publier sur vim → Python → Slack
Pour vider stdout en Python
Convertir numpy int64 en python int
python3: Comment utiliser la bouteille (2)
[Python] Convertir la liste en Pandas [Pandas]
Flirter de PHP à Python
Essayez de comprendre Python soi
Notes Python à oublier bientôt
[Python] Comment utiliser la liste 1
La route pour télécharger Matplotlib
Connectez-vous à Wikipedia avec Python
Comment mettre à jour Tkinter de Python vers la version 8.6
Publiez sur Slack avec Python 3
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
Publier sur Twitter en utilisant Python
Commencez à Selenium en utilisant python
Introduction à la communication série [Python]
Mettez à jour le python que vous aviez sur votre Mac à 3.7-> 3.8
3 raisons pour lesquelles les débutants en programmation devraient commencer avec Python
Convertir le projet Scratch en Python
Paiza Python Primer 8: Comprendre les classes
Python: comment utiliser pydub