[Road to Intermediate] Grundlegendes zu Python-Eigenschaften

Verknüpfung

[Road to Intermediate] Artikel-Link-Zusammenfassung

Einführung

Dies ist eine Zusammenfassung der "** Eigenschaften **", die in Python Tutorial nicht behandelt werden.

Ich schreibe derzeit Forschungscode in Python, aber ich habe ihn richtig geschrieben, also ist er durcheinander. Daher werde ich eine mittlere Python-Ebene anstreben und Code anstreben, den jeder lesen und verstehen kann.

Was ist eine Immobilie?

Was ist überhaupt eine Immobilie? Eigenschaften repräsentieren "Objektattribut- / Eigenschaftsdaten".

... Ich weiß es nicht.

Betrachten Sie beispielsweise die Klasse Player, die in einem zweidimensionalen Schießspiel verwendet wird.

Spielerinstanzen zum Bewegen und Zeichnen in Schießspielen

Ich habe die Informationen von.

Auf diese Weise werden die Attribut- / Eigenschaftsdaten jeder Instanz als ** Eigenschaft ** bezeichnet.

Versuchen Sie, Player zu implementieren

Lassen Sie uns vorerst eine normale Player-Klasse implementieren.

Bereiten wir eine Verschiebungsfunktion vor, die sich mit jeder Koordinate bewegt.

Der Spieler hat diesmal einen beweglichen Bereich von $ 0 {\ leqq} x, y {\ leqq} 500 $ für $ x und 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)

Der obige Quellcode funktioniert normal und ist einfach. In Bezug auf die Objektorientierung gibt es jedoch einige Probleme mit dem obigen Quellcode.

Problem 1 Kapselung

Die obige Klasse kann mit ** direkt ** Eigenschaftsvariablen manipuliert werden.

Dies ist nicht in sehr gutem Zustand. Dies liegt daran, dass die Möglichkeit besteht, unbequeme Variablen festzulegen oder zu ändern.

Die grundlegende Objektorientierung besteht auch darin, dass sich der Status je nach Methode ändert.

Problem 2 außerhalb des Bereichs

Ich möchte, dass diese Player-Klasse in $ 0 {\ leqq} x, y {\ leqq} 500 $ für $ x und y $ ausgeführt wird. Die oben beschriebene Verschiebungsfunktion führte jedoch dazu, dass die Reichweite überschritten wurde.

Ist es möglich, den Prozess so einzustellen, dass er gleichzeitig mit dem Einstellen der Variablen im Bereich bleibt?

Eigentum

Daher verwenden wir die Notationseigenschaft von Python.

Schreiben wir den Quellcode wie folgt um.

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)

Schauen wir uns den Inhalt einzeln an.

init

Darin werden Variablen mit _x initialisiert. Es scheint, dass Variablen, die Sie nur intern verarbeiten möchten, häufig mit Unterstrichen wie _x ausgedrückt werden.

@property

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

@property
def Name der externen öffentlichen Variablen(self):
interne Variable zurückgeben

Schauen wir uns als nächstes x (self) an. Es funktioniert wie eine Methode, kann aber außerhalb der Klasse wie eine "nur eine Variable" aussehen. Dies ist für ** Rückgabe des Wertes nach außen **.

Dies liegt daran, dass wir die Notation @ property ** decorator ** über dieser Funktionsdefinition verwenden. In Bezug auf Dekorateure werde ich das nächste Mal einen weiteren Artikel schreiben.

Durch Hinzufügen des Schlüsselworts @property zu einer Methode können Sie den Wert vorerst mit diesem Methodennamen von außerhalb der Klasse abrufen.

@Externe öffentliche Variable name.setter

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

    @Name der externen öffentlichen Variablen.setter
def Name der externen öffentlichen Variablen(self, dx):
        self.Interne Variablen+= dx
        self.Interne Variablen= max(0, min(self.MAX_X, self._x))

Die zuvor erwähnte @ -Eigenschaft war ein Schlüsselwort zum Abrufen und Verwenden eines Werts von außerhalb der Klasse.

Dies bedeutet, dass es auch Schlüsselwörter gibt, die einen Wert von außen angeben und den Wert von innen festlegen.

Verwenden Sie das Schlüsselwort "@external public variable name.setter". Auf diese Weise können Sie den Wert intern in der üblichen Notation festlegen.

Die Freude an der Immobilie

Was ist die Freude an der Immobilie?

Tatsächlich haben Python-Eigenschaften eine andere Form als andere Sprachen. Ursprünglich berührte ich C #, C ++ und Java, daher war ich ziemlich überrascht und unbehaglich.

Python-Eigenschaften sind

Das sage ich gerne.

In anderen Sprachen

player.setValueA(50);

Es musste in Form einer Funktion / Methode beschrieben werden, sozusagen war es ** redundant **.

Verwenden Sie in Python die Sprachspezifikation, die nur für dynamische Sprachen gilt, die als Dekoratoren bezeichnet werden. Stellen Sie Methoden wie Variablen nach außen bereit Intern können Sie zusätzliche Verarbeitung schreiben.

Wenn Sie jedoch zu viel komplizierten Inhalt in den Setter schreiben, wird dies zu einem Fehler, und Sie müssen sich dessen bewusst sein, sodass es möglicherweise erforderlich ist, den Inhalt hell zu machen.

Schließlich

Ich habe die Eigenschaften zusammengefasst! Da ich ein Anfänger bin, denke ich, dass es viele Fehler gibt. Wir wären Ihnen dankbar, wenn Sie uns Ihre Ratschläge und Meinungen geben könnten!

Recommended Posts

[Road to Intermediate] Grundlegendes zu Python-Eigenschaften
Ein Weg zum mittleren Python
[Road to Intermediate Python] Verwenden Sie ternäre Operatoren
[Road to Intermediate Python] Verwenden Sie Lambda-Ausdrücke
[Road to Intermediate Python] Zusammenfassung der Artikelverknüpfungen
[Road to Intermediate] Python scheint alles Objekte zu sein
[Road to Intermediate Python] Definieren Sie die Funktion __getattr__ in der Klasse
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
[Road to Intermediate Python] Installieren Sie Pakete in großen Mengen mit pip
[Python] Weg zur Serpent (3) Python-Klasse
[Road to Intermediate Python] Verwenden Sie die if-Anweisung in der Listeneinschlussnotation
[Road to Intermediate Python] Aktiviert Vergleichsoperationen mit Originalklassen
[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf
[Python] Straße zu Schlangen (1) Umgebungskonstruktion
Auf Python 2.7.9 aktualisiert
"Backport" zu Python 2
[Python] Weg zur Schlange (6) Manipuliere Pandas
[Road to Intermediate] Was sind Pythons * Argumente, ** Kwargs?
So installieren Sie Python
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
Schreiben Sie Python2-Code in Python3 um (2to3)
So installieren Sie Python
Einführung in die Python-Sprache
Einführung in OpenCV (Python) - (2)
Einführung von Python 2.7 in CentOS 6.6
Der Weg nach Pythonista
Verbinden Sie Python mit MySQL
Der Weg nach Djangoist
[Road to Intermediate] Verwenden Sie die in Python integrierten Funktionsvariablen
Weg zur LPIC-1-Akquisition
[Python] Weg zur Schlange (5) Spiele mit Matplotlib
Stellen Sie mit Python eine Verbindung zu BigQuery her
[Neueste Version 2020.8] So installieren Sie Python
[Python] Datum in Zeichenfolge konvertieren
Post von Python nach Slack
So installieren Sie Python [Windows]
poste an vim → Python → Slack
So löschen Sie stdout in Python
Konvertieren Sie numpy int64 in python int
python3: Verwendung der Flasche (2)
[Python] Liste in Pandas konvertieren [Pandas]
Flirte von PHP nach Python
Versuchen Sie, Python selbst zu verstehen
Python-Notizen, die Sie bald vergessen sollten
[Python] Verwendung von Liste 1
Der Weg zum Herunterladen von Matplotlib
Stellen Sie mit Python eine Verbindung zu Wikipedia her
So aktualisieren Sie Pythons Tkinter auf 8.6
Post to Slack mit Python 3
Anaconda aktualisiert von 4.2.0 auf 4.3.0 (python3.5 aktualisiert auf python3.6)
Mit Python auf Twitter posten
Starten Sie mit Python zu Selen
Einführung in die serielle Kommunikation [Python]
Aktualisieren Sie die Python, die Sie auf Ihrem Mac hatten, auf 3.7-> 3.8
3 Gründe für die Programmierung Anfänger sollten mit Python beginnen
Konvertieren Sie das Scratch-Projekt in Python
Paiza Python Primer 8: Grundlegendes zu Klassen
Python: Wie man pydub benutzt