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».
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.
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.
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)
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.
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