Beim Studium der Objektorientierung habe ich oft "Die Logik, die mehrere Objekte desselben Typs verarbeitet, wird in einer erstklassigen Sammlung zusammengefasst." Sie werden solche Sätze sehen. Bis jetzt wusste ich nicht, wie ich es in Python schreiben sollte. Ich habe einen Artikel geschrieben, weil ich auf meine eigene Weise schreiben konnte: "Wenn Sie dies schreiben, wird es leichter zu verstehen sein."
Betrachten Sie eine Produktklasse und ihre erstklassige Sammlung (im Folgenden als Sammlung bezeichnet).
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_Sie können angeben, welcher Typ werkseitig initialisiert werden soll
items: List[Item] = dataclasses.field(default_factory=list)
def add_item(self, item):
#Beim Hinzufügen eines Elements wird ein neues Objekt erstellt und zurückgegeben.
#So erstellen Sie ein neues Objekt mit hinzugefügten Elementen ohne Nebenwirkungen auf eine vorhandene Sammlung
#Mir fiel nichts anderes ein ...
return ItemCollection(self.items + [item])
Bitte lesen Sie hier für die grundlegende Verwendung von Datenklassen ... (https://qiita.com/madogiwa_429/items/55c78fc6be7887a28df8)
Damit können Sie vorerst eine erstklassige Sammlung erstellen.
Der Grund, warum ich es für die Sammlung als unpraktisch empfand Es gab einen Kommentar, dass "eine Beschreibung der Verarbeitung, die leicht zu schreiben sein sollte, problematisch wird". Wenn Sie in diesem Beispiel beispielsweise den Gesamtpreis der in der Sammlung gespeicherten Produkte ermitteln möchten, Wie soll ich es schreiben? Wenn Sie es mit dem Typ int in die Liste aufnehmen, können Sie es mit der Summenfunktion schreiben. Durch das Speichern der Item-Klasse wird es unmöglich, sie kurz zu beschreiben. Aus diesem Grund wusste ich nicht, ob es wirklich gut ist, im Umgang mit Arrays objektorientiert zu schreiben.
Die Kartenfunktion bietet eine bestimmte Lösung für diesen Zweifel. Die Kartenfunktion behandelt jedes Element eines iterierbaren Objekts, z. B. eine Liste. Mit der Kartenfunktion kann die Methode zur Berechnung des Gesamtpreises der in der Sammlung gespeicherten Produkte wie folgt geschrieben werden.
@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):
#Instanzvariablen für jedes Element von Elementen"price"Kann nur die Werte von auflisten
price_list = list(map(lambda item: item.price, self.items))
return sum(price_list)
Mit der Kartenfunktion konnte ich die Methode der erstklassigen Sammlung präzise schreiben. Ich hoffe, es ist hilfreich für diejenigen, die die gleichen Probleme haben, wenn sie objektorientiert in Python schreiben.
Durch Setzen von eingefroren = True kann eine Neuzuweisung von Instanzvariablen verhindert werden. Ich konnte das Hinzufügen von Listenelementen nicht verhindern ...
test = ItemCollection()
#Dieser Vorgang führt zu einem Fehler
test.items = ['Tesuto']
#Dieser Vorgang führt nicht zu einem Fehler und es werden Elemente hinzugefügt
test.items.append('Tesuto')
Recommended Posts