Générer une collection de première classe en Python

introduction

Lorsque j'étudie l'orientation objet, je "Les logiques qui gèrent plusieurs objets du même type sont rassemblées dans une collection de première classe." Vous verrez des phrases comme celle-ci. Jusqu'à présent, je ne savais pas comment l'écrire en python. J'ai écrit un article parce que j'ai pu écrire à ma manière: «Si vous écrivez ceci, ce sera plus facile à comprendre».

Je vais l'écrire pour le moment

Considérons une classe de produits et sa collection de première classe (ci-après dénommée la collection).

import dataclasses
from typing import List

@dataclasses.dataclass(frozen=True)
class Item(object):
    name: str
    price: int

@dataclasses.dataclass(frozen=True)
class ItemCollection(object):
    # default_Vous pouvez spécifier le type à initialiser en usine
    items: List[Item] = dataclasses.field(default_factory=list)

    def add_item(self, item):
        #Lors de l'ajout d'un élément, il crée et renvoie un nouvel objet.
        #Comment créer un nouvel objet avec des éléments ajoutés sans aucun effet secondaire sur une collection existante
        #Je ne pouvais penser à rien d'autre ...
        return ItemCollection(self.items + [item])

Veuillez lire ici pour l'utilisation de base des classes de données ... (https://qiita.com/madogiwa_429/items/55c78fc6be7887a28df8)

Pour le moment, vous pouvez faire une collection de première classe avec cela.

Des doutes sur la collection de première classe

La raison pour laquelle je trouvais cela gênant pour la collection Il y avait un commentaire selon lequel "une description du traitement qui devrait être facile à écrire devient problématique". Par exemple, dans cet exemple, lorsque vous souhaitez trouver le prix total des produits stockés dans la collection, Comment dois-je l'écrire? Si vous le mettez dans la liste avec le type int, vous pouvez l'écrire avec la fonction sum, En stockant la classe Item, il devient impossible de la décrire de manière concise. À cause de cela, je ne savais pas s'il était vraiment bon d'écrire orienté objet quand il s'agissait de tableaux.

Utilisez la fonction de carte

La fonction map apporte une certaine solution à ce doute. La fonction map gère chaque élément d'un objet itérable tel qu'une liste. En utilisant la fonction de carte, la méthode de calcul du prix total des produits stockés dans la collection peut être écrite comme suit.

@dataclasses.dataclass(frozen=True)
class ItemCollection(object):
    items: List[Item] = dataclasses.field(default_factory=list)

    def add_item(self, item):
        return ItemCollection(self.items + [item])

    def sum_price(self):
        #Variables d'instance pour chaque élément d'éléments"price"Ne peut lister que les valeurs de
        price_list = list(map(lambda item: item.price, self.items))
        return sum(price_list)        

Résumé

En utilisant la fonction map, j'ai pu écrire la méthode de la première collection de classe de manière concise. J'espère que cela sera utile pour ceux qui ont les mêmes problèmes lors de l'écriture orientée objet en Python.

Au fait ...

En définissant gelé = True, il est possible d'empêcher la réaffectation des variables d'instance. Je n'ai pas pu empêcher l'ajout d'éléments de liste ...

test = ItemCollection()

#Ce processus entraîne une erreur
test.items = ['Tesuto']

#Ce processus n'entraîne pas d'erreur et des éléments sont ajoutés
test.items.append('Tesuto')

Recommended Posts

Générer une collection de première classe en Python
Générer une classe à partir d'une chaîne en Python
classe de cas en python
Notation de classe en Python
J'ai écrit une classe en Python3 et Java
Prendre une capture d'écran en Python
Créer un bot de collecte de données en Python à l'aide de Selenium
Générer une vignette arrondie en Python
Créer une fonction en Python
Créer un dictionnaire en Python
Une collection de code souvent utilisée dans Python personnel
Générer une distribution U en Python
Créer un bookmarklet en Python
Générer du code QR en Python
Collection de traitement d'image en Python
Dessinez un cœur en Python
Générez 8 * 8 (64) cubes avec Blender Python
Comment utiliser la méthode __call__ dans la classe Python
Développer une bibliothèque pour obtenir la liste des collections Kindle en Python
[MQTT / Python] Implémentation d'une classe qui fait Pub / Sub de MQTT en Python
J'ai créé une classe en Python et essayé de taper du canard
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
Ecrire une dichotomie en Python
[python] Gérer les fonctions dans une liste
Première analyse de régression simple en Python
Appuyez sur une commande en Python (Windows)
[Python] Générer un code QR en mémoire
Opération de collecte de type Scala en Python
Les mines terrestres cachées dans les variables de classe Python
Créer un conteneur DI avec Python
Dessinez une matrice de diagramme de dispersion avec python
ABC166 en Python A ~ C problème
Générer le notebook Jupyter ".ipynb" en Python
Ecrire des algorithmes A * (A-star) en Python
Lire des morceaux PNG en Python (édition de classe)
Créer un fichier binaire en Python
Résoudre ABC036 A ~ C avec Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
[Python] Générer un mot de passe avec Slackbot
Implémentation d'un algorithme simple en Python 2
Examiner la classe d'un objet avec python
Résoudre ABC037 A ~ C avec Python
Exécutez un algorithme simple en Python
Dessinez un diagramme CNN en Python
Créer une chaîne aléatoire en Python
[Python] Hériter d'une classe avec des variables de classe
Générer un badge d'affichage du nombre de téléchargements de la bibliothèque Python
La première étape de Python Matplotlib
Lors de l'écriture d'un programme en Python
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
Une classe qui résume les méthodes fréquemment utilisées dans l'api twitter (python)
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Créer un décorateur de fonction Python avec Class
[Introduction à Python] Comment utiliser la classe en Python?
Résoudre ABC175 A, B, C avec Python