Erste Schritte mit Python für PHPer-Klassen

Dies ist eine Fortsetzung von Funktionen. Dieses Mal werde ich über die Klasse erklären!

Klassendefinition

Vergleichen wir zunächst die grundlegenden Beschreibungsmethoden. Es ist nicht so anders als Gatsuri, also denke ich, dass man es leicht lesen kann. Es gibt jedoch einige Unterschiede. ..

PHP-Code

<?php

class Hoge {
    static private $defaultValue = 'hogehoge';
    private $value = null;

    public function __construct($value=null) {
        if ($value) {
            $this->value = $value;  
        } else {
            $this->value = self::$defaultValue;
        }
    }

    public function getValue() {
        return $this->value;
    }
}

$hoge = new Hoge();
echo $hoge->getValue();

Python-Code

# coding=utf8

class Hoge(object):
    default_value = 'hogehoge'

    def __init__(self, value=None):
        if value:
            self.value = value
        else:
            self.value = self.default_value

    def get_value(self):
        return self.value

hoge = Hoge()
print(hoge.get_value())

Wie schreibt man

Die Klassendefinition erfolgt mit class wie in PHP. Wie die if-Anweisung und die Funktion wird der Bereich durch den Einzug anstelle des{}dargestellt. Vergessen Sie auch hier nicht das : (Doppelpunkt) am Ende der Klassendefinition.

Erben Sie die Objektklasse!

Stellen Sie beim Erstellen einer einfachen Klasse sicher, dass Sie die "Objektklasse" erben. Sie können es machen, ohne es zu erben, aber es gibt viele Vorteile, es zu erben. Wenn Sie mehr wissen möchten, lesen Sie bitte hier.

Python-Klassen haben keine Zugriffsmodifikatoren!

Dies ist einer der Orte, an denen Sie den Unterschied leicht erkennen können, indem Sie die Quellen vergleichen. In Python gibt es keinen "Zugriffsmodifikator" wie "public", und im Grunde wird alles als "public" behandelt. Wenn Sie vor dem Namen der Instanzvariablen oder -methode "__" hinzufügen, können Sie vorerst nicht darauf zugreifen.

Konstrukteur

Unnötig zu erwähnen, dass der Name der Konstruktormethode anders ist. PHP ist "__construct" und Python ist "__init __".

Was ist das Methodenargument selbst? ..

** Es ist einer der Teile namens "Python Kimoi !!!" **. .. Dieses "Selbst" ist ein "Verweis auf sich selbst (Ihre eigene Instanz)". Es ist zu kompliziert zu erklären, warum so etwas gemacht wird, also googeln Sie bitte jeden einzelnen. ..

Wichtig hierbei ist, dass ** das erste Argument der Methode immer einen Verweis auf sich selbst übergibt **.

Seien Sie vorsichtig mit den Definitionen von Instanz- und Klassenvariablen!

Im Fall von PHP wird die Definition unter Verwendung des "statischen Modifikators" geteilt, aber im Fall von Python muss die Definition der "Instanzvariablen" in der "Methode" wie "__init __" erfolgen. Alle Variablen, die außerhalb der Methode definiert sind, sind Klassenvariablen. Wenn Sie das folgende Beispiel ausführen, wird "Hoge.hoge" ausgegeben, aber Sie können sehen, dass "Hoge.piyo" einen Fehler verursacht.

# coding=utf8

class Hoge(object):
    hoge = 'hoge'  #Klassenvariable

    def __init__(self):
        self.piyo = 'piyo'  #Instanzvariable

print(Hoge.hoge)

#Nicht zugänglich, da die Instanzvariable nicht instanziiert wird
print(Hoge.piyo)

Bitte beachten Sie, dass es leicht zu übersehen ist (vergessen). ..

Verweis auf Instanzvariablen / -methoden

Dies ist auch selbsterklärend, aber in PHP ist es "$ this-> value" und in Python "self.value". Es gibt auch einen Unterschied zwischen dem "Pfeiloperator" und dem "Punktoperator". Seien Sie also bitte vorsichtig.

In Bezug auf "Klassenvariablen" und "statische Methoden" wird es in PHP als "sefl :: $ hoge" geschrieben, aber auf Python kann mit "self.hoge" wie Instanzvariablen zugegriffen werden.

Klassenvererbung

Lassen Sie uns über die Klassenvererbung sprechen. Beginnen Sie wie immer mit dem Beispielcode.

PHP-Code

<?php

class BaseClass {
    public function __construct($value) {
        $this->value = $value;
    }

    public function getValue() {
        return$this->value;
    }
}

class SubClass extends BaseClass {
    public function __construct($value) {
        $value = $value * 2;
        parent::__construct($value);
    }
}

$hoge = new SubClass(10);
echo $hoge->getValue();

Python-Code

# coding=utf8

class BaseClass(object):
    def __init__(self, value):
        self.value = value

    def get_value(self):
        return self.value

class SubClass(BaseClass):
    def __init__(self, value):
        value = value * 2
        super(SubClass, self).__init__(value)

hoge = SubClass(10)
print(hoge.get_value())

Vererbungsbeschreibung

Ich habe es bereits in der Erklärung der Klassendefinition getan, aber ich werde es noch einmal erklären. Um eine Klasse in Python zu erben, schreiben Sie einfach den Namen der Klasse, die Sie in () erben möchten, nach dem Klassennamen.

class SubClass(BaseClass):

Rufen Sie eine Methode der übergeordneten Klasse auf

Verwenden Sie in Python die Superfunktion, um auf die übergeordnete Klasse zuzugreifen. Im Beispiel wird die Methode (Konstruktor) der übergeordneten Klasse im Konstruktor aufgerufen, Sie können sie jedoch auf dieselbe Weise wie mit einer normalen Methode aufrufen.

super(SubClass, self).__init__(value)

Im zerlegten Zustand sieht es wie folgt aus.

super(Eigene Klasse,Eigene Instanz).Funktion, die Sie aufrufen möchten(Streit)

Mehrfachvererbung von Klassen

Wie Python die Mehrfachvererbung von Klassen unterstützt! Es handelt sich um eine bequeme Mehrfachvererbung, die jedoch in der Regel kompliziert ist. Verwenden Sie sie daher mit Vorsicht.

Wie schreibe ich Mehrfachvererbung

Entspricht der normalen Vererbungsbeschreibung. Die Klasse, die Sie erben möchten, wird in () beschrieben. Wenn jedoch mehrere Klassen vorhanden sind, trennen Sie diese einfach durch , (Komma).

class SubClass(HogeClass, PiyoClass):

Die Reihenfolge, in der die Konstruktoren aufgerufen werden

** Seien Sie vorsichtig, da es hier verwirrend ist! ** ** ** Zuerst Beispielcode.

# coding=utf8

class A(object):
    def __init__(self):
        super(A, self).__init__()
        print('A')

class B(object):
    def __init__(self):
        super(B, self).__init__()
        print('B')

class C(A, B):
    def __init__(self):
        super(C, self).__init__()
        print('C')

instance = C()

Es gibt eine "C-Klasse", die zwei der "A-Klasse" und der "B-Klasse" erbt. Wenn Sie dies tun, erhalten Sie das folgende Ergebnis.

B
A
C

Wenn Sie sich das Ergebnis ansehen, können Sie sehen, dass sie in der Reihenfolge "B-> A-> C" aufgerufen werden.

Warum ist die Superfunktion in der übergeordneten Klasse geschrieben?

Ich habe zuvor erklärt, dass die "Superfunktion" für den Zugriff auf die übergeordnete Klasse dient, aber genau genommen für den Zugriff auf die "übergeordnete oder Geschwisterklasse". Die "Superfunktion" wird benötigt, weil die "A-Klasse" und die "B-Klasse", die die Elternklassen der "C-Klasse" sind, eine Geschwisterbeziehung haben.

Vielleicht ist diese Erklärung noch nicht ganz richtig, schauen Sie sich also die nächste an!

Warum ist die Reihenfolge B-> A-> C?

Die Definition von "C-Klasse" ist "Klasse C (A, B):" und "A-Klasse" wird zuerst deklariert. In diesem Fall wird der unmittelbare Elternteil der "C-Klasse" als "A-Klasse" behandelt. Mit anderen Worten, "super ()" in "C-Klasse" zeigt auf "A-Klasse".

Wenn Sie sich als nächstes "A-Klasse" ansehen, gibt es "B-Klasse" in der Beziehung der Brüder. Die "Super-Funktion" ist auch für den Zugriff auf Geschwisterklassen vorgesehen, daher zeigt "super ()" in "A-Klasse" auf "B-Klasse".

Der Rest ist "B-Klasse", aber es gibt kein Elternteil in "B-Klasse". Es gibt eine "A-Klasse" als Geschwisterbeziehung, aber da Python klug ist, wird die Beziehung, die Sie einmal verfolgt haben, ignoriert. Es gibt also nichts, worauf super () von B class hinweist.

Infolgedessen lautet die Reihenfolge "B-> A-> C". Es ist ein wenig verwirrend, aber hast du es verstanden?

Mixin Klasse

Ist es nahe an "Merkmal" in PHP? ** Wenn du denkst "Ein neues kommt heraus ..." **, mach dir keine Sorgen. Dies ist nur eine Geschichte von "Mehrfachvererbung".

Zunächst eine Probe.

# coding=utf8

class Mixin(object):
    def say(self):
        print('Hoge!!!!!')

class Human(Mixin, object):
    pass  #Pass bedeutet "nichts tun".

class Cat(Mixin, object):
    pass

human = Human()
human.say()

cat = Cat()
cat.say()

Die "menschliche Klasse" und die "Katzenklasse" erben mehrere "Objekt-" bzw. "Mixin-Klassen". Es ist wirklich nur "Mehrfachvererbung", aber der Grund, warum ich verschiedene Titel gebe und dieselbe Geschichte noch einmal erzähle, ist **, weil es einfach ist, Funktionen zu mehreren Klassen hinzuzufügen **. Das "Merkmal" von PHP war auch ein Mechanismus zum einfachen Hinzufügen von Funktionen zu mehreren Klassen. Dasselbe kann in Python mit "Mehrfachvererbung" ausgedrückt werden.

Die meiste Verwendung von "Mehrfachvererbung" in Python ist "Mixin-Klasse". Ich denke, es wird in Django verwendet, also bitte denken Sie daran!

Übrigens ist in diesem Beispiel die "Mixin-Klasse" eine Unterklasse der "Objektklasse", so dass sowohl die "Human-Klasse" als auch die "Cat-Klasse" wie folgt definiert werden können.

class Human(Mixin):
    pass  #Pass bedeutet "nichts tun".

class Cat(Mixin):
    pass

Es ist nur eine Geschichte der Vererbung. ..

Zusammenfassung

Dieses Mal habe ich vorgestellt, wie man eine Klasse erstellt und erbt. Es fühlt sich kompliziert an, weil es viele Dinge gibt, die getan werden können, aber es ist sehr bequem und macht Spaß, es zu meistern!

Was soll ich als nächstes tun? Es ist unentschlossen. ..

Recommended Posts

Erste Schritte mit Python für PHPer-Klassen
Erste Schritte mit Python für PHPer-Funktionen
1.1 Erste Schritte mit Python
Erste Schritte mit Python
Erste Schritte mit Python
Erste Schritte mit Python für PHPer-Super Basics
Einführung in Python-Funktionen
Erste Schritte mit Python Django (1)
Erste Schritte mit Python Django (4)
Erste Schritte mit Python Django (3)
Einführung in Python Django (6)
Erste Schritte mit Python Django (5)
[Übersetzung] Erste Schritte mit Rust für Python-Programmierer
Einstellungen für den Einstieg in MongoDB mit Python
Erste Schritte mit Python Responder v2
Erste Schritte mit Python-Webanwendungen
Erste Schritte mit Julia für Pythonista
Erste Schritte mit Python Grundlagen von Python
Erste Schritte mit Google App Engine für Python und PHP
Erste Schritte mit genetischen Python-Algorithmen
Erste Schritte mit Python 3.8 unter Windows
Erste Schritte mit Python3 # 1 Grundkenntnisse erlernen
Erste Schritte mit Python Web Scraping Practice
Erste Schritte mit Python Web Scraping Practice
Erste Schritte mit Dynamo von Python Boto
Erste Schritte mit Lisp für Pythonista: Ergänzung
Django 1.11 wurde mit Python3.6 gestartet
Erste Schritte mit Android!
Erste Schritte mit apache2
Erste Schritte mit Django 1
Einführung in die Optimierung
Erste Schritte mit Numpy
Erste Schritte mit Spark
Erste Schritte mit Pydantic
Erste Schritte mit Jython
Erste Schritte mit Django 2
Erstellen einer Windows 7-Umgebung für eine Einführung in das maschinelle Lernen mit Python
Erste Schritte mit Python mit 100 Klopfen bei der Sprachverarbeitung
Erste Schritte mit AWS IoT in Python
Materialien zum Lesen, wenn Sie mit Python beginnen
Übersetzen Erste Schritte mit TensorFlow
Einführung in Tkinter 2: Button
Erste Schritte mit Go Assembly
Erste Schritte mit PKI mit Golang ―― 4
Beginnen Sie mit Python! ~ ② Grammatik ~
Erste Schritte mit Django mit PyCharm
Erste Schritte mit Python3 # 2 Erfahren Sie mehr über Typen und Variablen
Beginnen Sie mit Python! ~ ① Umweltbau ~
Erste Schritte mit Python3 # 3 Versuchen Sie erweiterte Berechnungen mit der import-Anweisung
Einführung in Git (1) History-Speicher
Erste Schritte mit Sphinx. Generieren Sie Docstring mit Sphinx
Erste Schritte mit Sparse Matrix mit scipy.sparse
Erste Schritte mit Python
Erste Schritte mit Mathematik Beginnen mit Python Programming Challenge Persönliche Notizen-Problem 1-1
Erste Schritte mit der Cisco Spark REST-API
Python gestartet