Heim  >  Artikel  >  Backend-Entwicklung  >  Klassen in Python

Klassen in Python

高洛峰
高洛峰Original
2016-10-19 15:19:301615Durchsuche

Obwohl Python in der Funktionsprogrammierung Vorteile bietet, die andere Sprachen nicht bieten können, sollten wir nicht vergessen, dass Python auch eine OO-Sprache ist. Während wir auf die Vorteile von Python in FP achten, müssen wir daher auch die OO-Eigenschaften von Python verstehen.

Um die OO-Funktionen von Python zu diskutieren, ist es natürlich das erste, was man tun muss, um die Klasse in Python zu verstehen. Es ist sehr einfach, Klassen zu definieren und Objektinstanzen in Python zu erstellen. Der spezifische Code lautet wie folgt:

class GrandPa:
    def __init__(self):
        print('I\'m GrandPa')
  
  
class Father(GrandPa):
    def __init__(self):
        print('I\'m Father!')
  
class Son(Father):
    """A simple example class"""
    i = 12345
    def __init__(self):
        print('这是构造函数,son')
    def sayHello(self):
        return 'hello world'
  
if __name__ == '__main__':
    son = Son()
    # 类型帮助信息
    print('类型帮助信息: ',Son.__doc__)
    #类型名称
    print('类型名称:',Son.__name__)
    #类型所继承的基类
    print('类型所继承的基类:',Son.__bases__)
    #类型字典
    print('类型字典:',Son.__dict__)
    #类型所在模块
    print('类型所在模块:',Son.__module__)
    #实例类型
    print('实例类型:',Son().__class__)

Operation:

Python 3.3.2 (v3.3.2:d047928ae3f6, Mai 16 2013, 00:03:43) [MSC v.1600 32 Bit (Intel)] auf Win32

Geben Sie „Copyright“, „Credits“ oder „License()“ ein, um weitere Informationen zu erhalten.

> >> =============================== NEUSTART ============ === ===============

>>>

Dies ist der Konstruktor, Sohn

Hilfeinformationen : Eine einfache Beispielklasse

Typname: Son

Die vom Typ geerbte Basisklasse: (,)

Typwörterbuch: {'__module__': ' __main__', ' sayHello': , '__doc__': 'Eine einfache Beispielklasse', '__init__': , 'i': 12345}

Das Modul, in dem sich der Typ befindet: __main__

Das ist der Konstruktor, Sohn

Instanztyp:

>>>

#Python unterstützt Mehrfachvererbung

Zunächst werden Sie feststellen, dass es in der Klassendefinition eine Klammer gibt, in der sich die Vererbung widerspiegelt. Java verwendet Extends, C# und C verwenden Doppelpunkte (:) und Python verwendet Klammern. In den Klammern sind zwei Werte enthalten. Wenn Sie schlau sind, werden Sie es auf jeden Fall herausfinden:

#__init__ ist der Konstruktor in der Klasse

Zweiter Punkt , __init__ ist eine Klasse. Die beiden unterschiedlichen Formen von Konstruktoren spiegeln Pythons Unterstützung für Funktionsüberladung wider. Im Konstruktor gibt es einen speziellen Parameter self, dessen Bedeutung mit der in Java und C# üblichen übereinstimmt. Eines muss hier betont werden: Die in der Klasse definierte Methode ist im Wesentlichen eine Funktion, aber der Parameter self muss bei der Definition der Methode enthalten sein und der Parameter self muss an erster Stelle stehen

#python-Mitgliedsvariablen

Der dritte Punkt ist, dass Sie in Python die Datenmitglieder der Klasse nicht explizit deklarieren müssen. Stattdessen werden die zugewiesenen Variablen beim Zuweisen von Werten entsprechend zu Datenmitgliedern der Klasse, wie in der Abbildung gezeigt Code x und y in . Sie müssen Datenelemente nicht nur nicht explizit deklarieren, sondern, was noch spezieller ist, Sie können die Datenelemente in der Klasse sogar über die Methode del löschen. Als ich eine solche Funktion zum ersten Mal sah, war ich wirklich überrascht. Der erste Punkt von OO ist schließlich die Kapselung, aber zerstört diese Funktion die Eigenschaften der Kapselung?

#Python-Methodenmehrdeutigkeitsproblem

Der vierte Punkt ist, dass, weil Python Mehrfachvererbung unterstützt, Methodenmehrdeutigkeitsprobleme auftreten können[1]. Da Python jedoch der Tiefensuchregel folgt, wird das Problem der Methodenmehrdeutigkeit vermieden. Im obigen Code erbt MyClass beispielsweise sowohl von BaseClassA als auch von BaseClassB. Angenommen, MyClass ruft eine Methode namens DeriveMethod auf, die sowohl in BaseClassA als auch in BaseClassB definiert ist und die Signatur genau gleich ist. Dann wird die Methode in BaseClassA aufgerufen . Wenn derivativeMethod nicht in BaseClassA definiert ist, die übergeordnete Klasse von BaseClassA diese Methode jedoch definiert, wird die derivativeMethod in der übergeordneten Klasse von BaseClassA aufgerufen. Kurz gesagt, der Suchpfad für die Vererbungsmethode verläuft von links nach rechts. Nach Auswahl einer BaseClass wird die Suche entlang der Vererbungsstruktur der BaseClass bis zum Anfang und dann zu einer anderen BaseClass durchgeführt.

Das ist vorerst alles. Die OO-Funktionen in Python werden in zukünftigen Beiträgen näher beschrieben.

[1] Methodenmehrdeutigkeit: Da eine Klasse gleichzeitig von zwei oder mehr übergeordneten Klassen erbt und es in diesen übergeordneten Klassen Methoden mit genau derselben Signatur gibt, kann der Compiler dies nicht ermitteln Unterklassen. Welche übergeordnete Klasse erbt die Methode, was zu Mehrdeutigkeit der Methode führt?


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn