Python: Ein Hinweis zu Klasse 1 "Abstract"

Zusammenfassung: Von der Verwendung von Teilen bis zur Kombination

Wir werden nicht nur Programmfragmente verwenden, sondern auch lernen, wie Programme implementiert werden können, die diese kombinieren.

Aktueller Status

Dank der umfangreichen Bibliothek und des Kommentars gelang es mir, die kleine Idee zu verwirklichen, die ich machen wollte und die ich machen wollte. Auf der anderen Seite, wenn Sie versuchen, sie zu einem Programm zu kombinieren, wird das Ganze durcheinander gebracht und Sie werden nicht in der Lage sein, damit umzugehen.

Daher werden wir hier organisieren, was wir über die Klasse gelernt haben, und verschiedene Themen zusammenfassen, um ein "Programm zu erstellen, das von uns selbst erweitert und gepflegt werden kann". Als Programmierer, der noch Anfänger ist, sind Ratschläge willkommen.

Klassenabstraktion

Stellen Sie den Abstraktionsgrad entsprechend ein

Die Benennung ist im Programm wichtig. Wenn Sie ihm einen geeigneten Namen geben, wird dies Ihr Verständnis und Ihre Anerkennung beeinträchtigen. Um einen festen Überblick über das Ganze zu bekommen, muss der Abstraktionsgrad entsprechend der Situation bestimmt werden.

Abstraktionsgrad

Wenn Sie nach "Python-Klassenabstraktion" suchen, beziehen sich die meisten Informationen auf die Verwendung von Metaklassen. Dies ist ein Teil, der unerwartet schwer zu verstehen war.

Stellen Sie sich als Beispiel die Situation vor, ein klassisches westliches Fantasy-Rollenspiel zu machen. Welche Art von Namen sollten wir geben, wenn wir eine Klasse erstellen, die sich mit einem Charakter befasst, John, einem Dorfbewohner?

Zunächst einmal gehören verschiedene Dinge auf der Welt gleichzeitig mehreren Gruppen an. Natürlich ist John keine Ausnahme.

概念図.png

Es gibt eine Reihe von Namen, die John nur für einen kurzen Blick vergeben kann. Ein Objekt, bei dem es sich um alle Objekte (Grundstücke, Bäume, Gebäude, Charaktere usw.) handelt, die im Spiel vorhanden sind. Die Kreatur ist ein Lebewesen unter Lebewesen und leblosen Gegenständen. Humanoid, eine humanoide Kreatur, zu der sowohl Elfen und Zwerge als auch normale Menschen gehören können. Als Ergebnis der endlosen Verfolgung zwischen den humanoiden Kreaturen erreichen wir den Dorfbewohner John.

Zu hoher Abstraktionsgrad

Wenn es um "Möchten Sie Creature machen, weil es vorerst eine Kreatur ist?" Geht, wird die Implementierung meiner Meinung nach wie folgt aussehen.

creature.py


class Creature:
    def __init__(self, hp, mp, start_position, area):
        self.hp = hp
        self.mp = mp
        self.position = start_position
        self.area = area
        self.oxygen = 100
    
    def move(self, next_position):
        if self.area == "land":
            self.walk()
            self.position = next_position
        
        elif self.area == "water":
            self.swim()
            self.position = next_position
        
        elif self.area == "sky":
            self.fly()
            self.position = next_position
    
    def walk(self):
        print("Teku Teku")

    def swim(self):
        print("Sui")
    
    def fly(self):
        print("Byun")

Da es sich um eine Gruppe namens Kreatur handelt, müssen mindestens die am Boden lebenden Kreaturen, die unter Wasser lebenden Kreaturen und die in der Luft lebenden Kreaturen getrennt werden. In Anbetracht der Tatsache, dass die am Boden lebenden Kreaturen ins Wasser gelangen, habe ich das Gefühl, dass ich mit der Sauerstoffmenge umgehen muss. Gewichtsmanagement scheint für in der Luft lebende Kreaturen wichtig zu sein.

Da wir diesmal über die Fantasiewelt nachdenken, besteht außerdem die Möglichkeit, dass einige Kreaturen in der mit Humor kontaminierten Dämonenwelt leben und andere auf dem Boden, auf dem es kein Licht gibt. Gleichzeitig können wir davon ausgehen, dass die Anzahl der zu implementierenden Dinge schneller zunimmt, z. B. andere Bewegungsmethoden und das Setzen eines eindeutigen Status.

Zu geringe Abstraktion

Wenn Sie denken: "Abgesehen von den anderen, möchten Sie es als Dorfbewohner behalten?", Wird die Implementierung meiner Meinung nach wie folgt aussehen.

villager.py


class Villager:
    def __init__(self, name, hp, start_position):
        self.name = name
        self.hp = hp
        self.position = start_position
    
    def move(self, next_position):
        self.position = next_position
        print("Teku Teku")
    
    def speak(self, line="Hallo. Dies ist das Anfangsdorf"):
        print(f"{self.name}「{line}」")

villagerA = Villager("John", 100, [0,0])
villagerA.speak()
villagerA.speak("Woher kommst du?")

#Ausführungsergebnis
'''
John "Hallo. Dies ist das Dorf des Anfangs."
John "Woher kommst du?"
'''

Es unterscheidet sich von dem vorherigen und ist nur für Dorfbewohner gedacht. Daher ist es einfach zu überlegen, was implementiert werden soll. Wenn Sie es als NPC behandeln, sollten Sie es angemessen umgehen und wenn Sie mit ihm sprechen, sprechen Sie die entsprechenden Zeilen.

Auf der anderen Seite besteht der Wunsch, es ordentlich umzusetzen. Wenn man zum Beispiel überlegt, eine Burgstadt zu gründen und dort NPCs zu platzieren, scheint dieser Dorfbewohner mit ein wenig Basteln benutzt zu werden. Die Grundfunktion des Bewegens und Sprechens bleibt gleich.

In Anbetracht der späteren Erweiterbarkeit scheint der Name Villager nicht der beste zu sein. Versuchen Sie, den Wohnbereich zu unterteilen, oder fügen Sie jedem Wohnbereich Merkmale hinzu. Es ist eine Erweiterung wie das Erstellen eines Kindes, das nicht angreifen kann, um Abwechslung zu schaffen, oder eines Schurken, der angreifen kann.

Angemessene Abstraktion

Was ist also ein Name mit dem richtigen Abstraktionsgrad, der weder zu hoch noch zu niedrig ist? Es kann sich je nach Spezifikation beliebig ändern, aber die vernünftigen Punkte sind wie folgt.

resident.py


class Resident:
    def __init__(self, name, hp, start_position):
        self.name = name
        self.hp = hp
        self.position = start_position
    
    def move(self, next_position):
        self.position = next_position
    
    def speak(self, line="Hallo"):
        print(f"{self.name}「{line}」")

citizenA = Resident("John", 100, [0,0])
citizenA.speak()
villagerA = Resident("Mary", 100, [0,10])
villagerA.speak("Hallo. Ist das South City?")

#Ausführungsergebnis
'''
John "Hallo"
Mary "Hallo. Ist das eine Südstadt?"
'''

Ich habe es Resident genannt, weil es irgendwo lebt. Dies schließt Dorfbewohner und Bürger ein. Es kann in Ordnung sein, einen Luftstadtbürger zu schaffen.

Zusammenfassung

Je höher der Abstraktionsgrad, desto mehr Dinge müssen implementiert werden. Wenn Sie beispielsweise ein Fahrzeug als Transportmittel anstelle von Auto implementieren, umfasst es Flugzeuge und Schiffe, und der Implementierungsaufwand erhöht sich erneut.

Andererseits verringert die Verringerung des Abstraktionsgrades den zu implementierenden Arbeitsaufwand, schränkt jedoch natürlich den Anwendungsbereich ein. In ähnlicher Weise wird am Beispiel eines Fahrzeugs die Implementierung von Bus anstelle von Auto den Betrachtungsbereich einschränken und die Implementierung erleichtern. Auf der anderen Seite wird es angesichts der Bewerbung bei Taxi, das auch Kunden befördert, eine weitere Zeit und Mühe kosten.

Beiseite

Ab dem nächsten Mal planen wir, die abstrakte Basisklasse sowie die Vererbung und Synthese / Delegation zusammenzufassen.

Recommended Posts

Python: Ein Hinweis zu Klasse 1 "Abstract"
Ein Hinweis zu [Python] __debug__
Ein Hinweis zu Mock (Python-Mock-Bibliothek)
Ein Hinweis zu __call__
Ein Hinweis zum Unterprozess
Ein Hinweis zu mprotect (2)
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Datenanalyse in Python: Ein Hinweis zu line_profiler
Informationen zu Python-Objekten und -Klassen
Ein Hinweis zu KornShell (ksh)
Memorandum über Korrelation [Python]
Ein Hinweis zur TensorFlow-Einführung
Ein Memorandum über den Python-Mock
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Hinweis zu get_scorer von sklearn
Was war überraschend an Python-Klassen?
Hinweis: Python
[Python] Über Executor und zukünftige Klassen
Python-Notiz
Eine Notiz, in der ein Python-Anfänger stecken blieb
Ein Java-Programmierer studierte Python. (Über Typ)
Eine Geschichte über Python Pop und Append
Apropos alte und neue Klassen in Python
Über den 02. Februar 2020 * Dies ist ein Python-Artikel.
Ein Memo, dass ich das Pyramid Tutorial ausprobiert habe
Über Python-Slices
Über die Einschlussnotation von Python
Python lernen note_002
Hinweis: Python-Dekorator
Python-Programmierhinweis
[Python] Lernnotiz 1
Über Python tqdm.
Über Python, Klasse
Python lernen note_004
Informationen zur Python-Vererbung
Über Python, range ()
Python lernen note_003
Über Python Decorator
[Hinweis] openCV + Python
Hinweis zu awk
Nur eine Notiz
Informationen zur Python-Referenz
Über Python-Dekorateure
[Python] Über Multi-Prozess
Python-Anfängernotiz
Ein Java-Programmierer studierte Python. (Über Funktionen (Methoden))
Ein Java-Programmierer studierte Python. (Über Dekorateure)
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Ein Memo, das ich in Python zusammengeführt habe
Einfache Pub / Sub-Programmhinweise in Python
Python Hinweis: Wenn Sie einer Zeichenfolge einen Wert zuweisen
Eine Geschichte über das Ausführen von Python auf PHP auf Heroku
Denken Sie daran, eine Python 3-Umgebung in einer Mac-Umgebung zu erstellen
Ein Memorandum über die Python-Tesseract-Wrapper-Bibliothek
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
Ein Hinweis zur neuen Stilbasisklasse
Modifikatoren zur Überprüfung von Memos mit MaxPlus
Eine Geschichte über das Ändern von Python und das Hinzufügen von Funktionen
Über Python für Schleife