Dies ist eine Fortsetzung von Funktionen. Dieses Mal werde ich über die Klasse erklären!
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())
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.
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.
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.
Unnötig zu erwähnen, dass der Name der Konstruktormethode anders ist. PHP ist "__construct" und Python ist "__init __".
** 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 **.
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). ..
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.
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())
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):
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)
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.
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):
** 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.
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!
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?
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. ..
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