Heim Backend-Entwicklung Python-Tutorial Eine kurze Einführung in die drei Methoden __init__, __new__ und __call__ in Python

Eine kurze Einführung in die drei Methoden __init__, __new__ und __call__ in Python

Jul 18, 2017 am 11:38 AM
python

Dieser Artikel stellt Ihnen hauptsächlich die relevanten Informationen zu den Methoden __init__, __new__ und __call__ in Python vor. Der Artikel stellt sie ausführlich anhand von Beispielcode vor, der für jeden, der ihn benötigt, einen gewissen Referenz- und Lernwert hat Referenzstudie, folgen wir dem Herausgeber und werfen einen Blick darauf.

Vorwort

Dieser Artikel führt Sie hauptsächlich in die relevanten Inhalte zu den Methoden __init__, __new__ und __call__ in Python ein und teilen Sie sie als Referenz Lassen Sie uns als Referenz lernen. Im Folgenden gibt es nicht viel zu sagen. Werfen wir einen Blick auf die detaillierte Einführung:

Alles hat einen Prozess von der Erstellung über die Verwendung bis zum Tod. Im objektorientierten Programmiermodell der Programmiersprache Objekte haben auch ein ähnliches Schicksal: Erstellung, Initialisierung, Verwendung und Speicherbereinigung. Verschiedene Phasen werden durch unterschiedliche Methoden (Rollen) ausgeführt.

Beim Definieren einer Klasse ist die Methode __init__ die am häufigsten verwendete Methode, während __new__ und __call__ seltener verwendet werden. Dieser Artikel soll Ihnen helfen, die korrekte Verwendung und die Anwendungsszenarien dieser drei Methoden zu erklären separat.

Ich werde in diesem Artikel nicht zu viel über Pythons Klassen im neuen und alten Stil diskutieren, da Klassen im alten Stil ein Konzept in Python2 sind und fast niemand mehr Klassen im alten Stil verwenden wird . Klassen neuen Stils müssen Objekte explizit erben. In Python3 gibt es nur Klassen neuen Stils, die standardmäßig Objekte erben und nicht explizit angegeben werden müssen.

__init__-Methode

Die __init__-Methode ist für die Initialisierung des Objekts verantwortlich, bevor das System diese Methode ausführt , andernfalls Was soll initialisiert werden? Schauen wir uns zunächst das Beispiel an:


# class A(object): python2 必须显示地继承object
class A:
 def __init__(self):
  print("__init__ ")
  super(A, self).__init__()

 def __new__(cls):
  print("__new__ ")
  return super(A, cls).__new__(cls)

 def __call__(self): # 可以定义任意参数
  print('__call__ ')

A()
Nach dem Login kopieren

Ausgabe


__new__
__init__
Nach dem Login kopieren

Aus dem Ausgabeergebnis, __new__ Methode Es wird zuerst aufgerufen, gibt ein Instanzobjekt zurück und dann wird __init__ aufgerufen. Die __call__-Methode wurde nicht aufgerufen. Lassen Sie uns zunächst über die ersten beiden Methoden sprechen, leicht umgeschrieben als:


def __init__(self):
 print("__init__ ")
 print(self)
 super(A, self).__init__()

def __new__(cls):
 print("__new__ ")
 self = super(A, cls).__new__(cls)
 print(self)
 return self
Nach dem Login kopieren

Ausgabe:


__new__ 
<__main__.A object at 0x1007a95f8>
__init__ 
<__main__.A object at 0x1007a95f8>
Nach dem Login kopieren

Der Ausgabe nach zu urteilen, ist der Rückgabewert der Methode __new__ das Instanzobjekt der Klasse. Dieses Instanzobjekt wird an den in __init__ definierten Parameter self übergeben. Methode, damit die Instanz Das Objekt kann korrekt initialisiert werden.

Wenn die Methode __new__ keinen Wert zurückgibt (oder None zurückgibt), wird __init__ nicht aufgerufen. Dies ist nicht sinnvoll, da das Instanzobjekt nicht erstellt wurde und der Aufruf von init außerdem keine Bedeutung hat Python legt außerdem fest, dass __init__ nur einen None-Wert zurückgeben kann, andernfalls wird ein Fehler gemeldet. Dies bleibt jedem selbst überlassen.

__init__-Methode kann verwendet werden, um einige Initialisierungsarbeiten durchzuführen, z. B. die Initialisierung des Status des Instanzobjekts:


def __init__(self, a, b):
 self.a = a
 self.b = b
 super(A, self).__init__()
Nach dem Login kopieren

Darüber hinaus in der __init__-Methode Die mit Ausnahme von self definierten Parameter müssen mit den Parametern in der __new__-Methode mit Ausnahme des cls-Parameters konsistent oder gleichwertig sein.


class B:
 def __init__(self, *args, **kwargs):
  print("init", args, kwargs)

 def __new__(cls, *args, **kwargs):
  print("new", args, kwargs)
  return super().__new__(cls)

B(1, 2, 3)

# 输出

new (1, 2, 3) {}
init (1, 2, 3) {}
Nach dem Login kopieren

__new__ Methode

Im Allgemeinen werden wir diese Methode nicht außer Kraft setzen, es sei denn, Sie wissen genau, wie Um dies zu tun, und wann werden Sie sich darum kümmern? Es wird als Konstruktor zum Erstellen von Objekten verwendet. Es handelt sich um eine Fabrikfunktion, die der Erstellung von Instanzobjekten gewidmet ist. Mit dieser Methode kann eines der bekanntesten Entwurfsmuster, das Singleton-Muster, implementiert werden. Sie können es verwenden, wenn Sie selbst Code auf Framework-Ebene schreiben. Wir können seine Anwendungsszenarien auch aus Open-Source-Code finden, beispielsweise dem Micro-Web-Framework Bootle.


class BaseController(object):
 _singleton = None
 def __new__(cls, *a, **k):
  if not cls._singleton:
   cls._singleton = object.__new__(cls, *a, **k)
  return cls._singleton
Nach dem Login kopieren

Dieser Code stammt von https://github.com/bottlepy/bottle/blob/release-0.6/bottle.py

Dies Die Methode __new__ ist eine Möglichkeit, den Singleton-Modus zu implementieren. Wenn das Instanzobjekt vorhanden ist, geben Sie es einfach zurück. Wenn es nicht vorhanden ist, erstellen Sie zuerst eine Instanz und kehren Sie dann zurück. Natürlich gibt es mehr als eine Möglichkeit, das Singleton-Muster zu implementieren:

Es sollte eine – und vorzugsweise nur eine – offensichtliche Möglichkeit geben, dies zu tun.

Verwenden Sie eine Methode, es ist am besten, nur eine Möglichkeit zu haben, eine Sache zu tun

__call__-Methode

Über die __call__-Methode , nein Lassen Sie uns zunächst kein Konzept erwähnen, nämlich aufrufbare Objekte. Unsere üblichen benutzerdefinierten Funktionen, integrierten Funktionen und Klassen sind alle aufrufbare Objekte, aber alles, was ein Klammerpaar () auf ein Objekt anwenden kann, kann aufgerufen werden ein aufrufbares Objekt. Sie können die Funktion callable

verwenden, um festzustellen, ob das Objekt ein aufrufbares Objekt ist. Wenn die __call__-Methode in der Klasse implementiert ist, wird das Instanzobjekt auch zu einem aufrufbaren Objekt Zum Anfang. Das Beispiel:


a = A()
print(callable(a)) # True
Nach dem Login kopieren

a ist ein Instanzobjekt und auch ein aufrufbares Objekt, dann kann ich es wie eine Funktion aufrufen. Versuchen Sie:


a() # __call__
Nach dem Login kopieren

很神奇不是,实例对象也可以像函数一样作为可调用对象来用,那么,这个特点在什么场景用得上呢?这个要结合类的特性来说,类可以记录数据(属性),而函数不行(闭包某种意义上也可行),利用这种特性可以实现基于类的装饰器,在类里面记录状态,比如,下面这个例子用于记录函数被调用的次数:


class Counter:
 def __init__(self, func):
  self.func = func
  self.count = 0

 def __call__(self, *args, **kwargs):
  self.count += 1
  return self.func(*args, **kwargs)

@Counter
def foo():
 pass

for i in range(10):
 foo()

print(foo.count) # 10
Nach dem Login kopieren

在 Bottle 中也有 call 方法 的使用案例,另外,stackoverflow 也有一些关于 call 的实践例子,推荐看看,如果你的项目中,需要更加抽象化、框架代码,那么这些高级特性往往能发挥出它作用。

总结

Das obige ist der detaillierte Inhalt vonEine kurze Einführung in die drei Methoden __init__, __new__ und __call__ in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wer bekommt mehr Python oder JavaScript bezahlt? Wer bekommt mehr Python oder JavaScript bezahlt? Apr 04, 2025 am 12:09 AM

Es gibt kein absolutes Gehalt für Python- und JavaScript -Entwickler, je nach Fähigkeiten und Branchenbedürfnissen. 1. Python kann mehr in Datenwissenschaft und maschinellem Lernen bezahlt werden. 2. JavaScript hat eine große Nachfrage in der Entwicklung von Front-End- und Full-Stack-Entwicklung, und sein Gehalt ist auch beträchtlich. 3. Einflussfaktoren umfassen Erfahrung, geografische Standort, Unternehmensgröße und spezifische Fähigkeiten.

Bedarf die Produktion von H5 -Seiten eine kontinuierliche Wartung? Bedarf die Produktion von H5 -Seiten eine kontinuierliche Wartung? Apr 05, 2025 pm 11:27 PM

Die H5 -Seite muss aufgrund von Faktoren wie Code -Schwachstellen, Browserkompatibilität, Leistungsoptimierung, Sicherheitsaktualisierungen und Verbesserungen der Benutzererfahrung kontinuierlich aufrechterhalten werden. Zu den effektiven Wartungsmethoden gehören das Erstellen eines vollständigen Testsystems, die Verwendung von Versionstools für Versionskontrolle, die regelmäßige Überwachung der Seitenleistung, das Sammeln von Benutzern und die Formulierung von Wartungsplänen.

Ist DifferiDItistinginginging verwandt? Ist DifferiDItistinginginging verwandt? Apr 03, 2025 pm 10:30 PM

Obwohl eindeutig und unterschiedlich mit der Unterscheidung zusammenhängen, werden sie unterschiedlich verwendet: Unterschieds (Adjektiv) beschreibt die Einzigartigkeit der Dinge selbst und wird verwendet, um Unterschiede zwischen den Dingen zu betonen; Das Unterscheidungsverhalten oder die Fähigkeit des Unterschieds ist eindeutig (Verb) und wird verwendet, um den Diskriminierungsprozess zu beschreiben. In der Programmierung wird häufig unterschiedlich, um die Einzigartigkeit von Elementen in einer Sammlung darzustellen, wie z. B. Deduplizierungsoperationen; Unterscheidet spiegelt sich in der Gestaltung von Algorithmen oder Funktionen wider, wie z. B. die Unterscheidung von ungeraden und sogar Zahlen. Bei der Optimierung sollte der eindeutige Betrieb den entsprechenden Algorithmus und die Datenstruktur auswählen, während der unterschiedliche Betrieb die Unterscheidung zwischen logischer Effizienz optimieren und auf das Schreiben klarer und lesbarer Code achten sollte.

Was ist der Grund, warum PS immer wieder Laden zeigt? Was ist der Grund, warum PS immer wieder Laden zeigt? Apr 06, 2025 pm 06:39 PM

PS "Laden" Probleme werden durch Probleme mit Ressourcenzugriff oder Verarbeitungsproblemen verursacht: Die Lesegeschwindigkeit von Festplatten ist langsam oder schlecht: Verwenden Sie Crystaldiskinfo, um die Gesundheit der Festplatte zu überprüfen und die problematische Festplatte zu ersetzen. Unzureichender Speicher: Upgrade-Speicher, um die Anforderungen von PS nach hochauflösenden Bildern und komplexen Schichtverarbeitung zu erfüllen. Grafikkartentreiber sind veraltet oder beschädigt: Aktualisieren Sie die Treiber, um die Kommunikation zwischen PS und der Grafikkarte zu optimieren. Dateipfade sind zu lang oder Dateinamen haben Sonderzeichen: Verwenden Sie kurze Pfade und vermeiden Sie Sonderzeichen. Das eigene Problem von PS: Installieren oder reparieren Sie das PS -Installateur neu.

Was bedeutet Summe in der C -Sprache? Was bedeutet Summe in der C -Sprache? Apr 03, 2025 pm 02:36 PM

Es gibt keine integrierte Summenfunktion in C für die Summe, kann jedoch implementiert werden durch: Verwenden einer Schleife, um Elemente nacheinander zu akkumulieren; Verwenden eines Zeigers, um auf die Elemente nacheinander zuzugreifen und zu akkumulieren; Betrachten Sie für große Datenvolumina parallele Berechnungen.

Wie erhalten Sie Echtzeit-Anwendungs- und Zuschauerdaten auf der Arbeit von 58.com? Wie erhalten Sie Echtzeit-Anwendungs- und Zuschauerdaten auf der Arbeit von 58.com? Apr 05, 2025 am 08:06 AM

Wie erhalte ich dynamische Daten von 58.com Arbeitsseite beim Kriechen? Wenn Sie eine Arbeitsseite von 58.com mit Crawler -Tools kriechen, können Sie auf diese begegnen ...

Kopieren Sie den Liebescode und fügen Sie den Liebescode kostenlos kopieren und einfügen Kopieren Sie den Liebescode und fügen Sie den Liebescode kostenlos kopieren und einfügen Apr 04, 2025 am 06:48 AM

Das Kopieren und Einfügen des Codes ist nicht unmöglich, sollte aber mit Vorsicht behandelt werden. Abhängigkeiten wie Umgebung, Bibliotheken, Versionen usw. im Code stimmen möglicherweise nicht mit dem aktuellen Projekt überein, was zu Fehlern oder unvorhersehbaren Ergebnissen führt. Stellen Sie sicher, dass der Kontext konsistent ist, einschließlich Dateipfade, abhängiger Bibliotheken und Python -Versionen. Wenn Sie den Code für eine bestimmte Bibliothek kopieren und einfügen, müssen Sie möglicherweise die Bibliothek und ihre Abhängigkeiten installieren. Zu den häufigen Fehlern gehören Pfadfehler, Versionskonflikte und inkonsistente Codestile. Die Leistungsoptimierung muss gemäß dem ursprünglichen Zweck und den Einschränkungen des Codes neu gestaltet oder neu gestaltet werden. Es ist entscheidend, den Code zu verstehen und den kopierten kopierten Code zu debuggen und nicht blind zu kopieren und einzufügen.

JavaScript -Code -Zeilenumbruch: Wie kann man langen String und Objektattributzugriff ordnungsgemäß behandeln? JavaScript -Code -Zeilenumbruch: Wie kann man langen String und Objektattributzugriff ordnungsgemäß behandeln? Apr 05, 2025 am 08:03 AM

Detaillierte Erläuterung von JavaScript-Code-Zeilen-Brechen-Fähigkeiten beim Schreiben von JavaScript-Code. Wir stoßen häufig auf eine zu lange Codezeile, die nicht nur die Lesbarkeit des Codes beeinflusst ...

See all articles