Heim  >  Artikel  >  Backend-Entwicklung  >  NotImplementedError: Wie behebe ich den Fehler einer nicht implementierten Python-Methode?

NotImplementedError: Wie behebe ich den Fehler einer nicht implementierten Python-Methode?

WBOY
WBOYOriginal
2023-06-24 14:16:369973Durchsuche

Wenn wir in der Python-Programmierung eine Methode aufrufen möchten, die noch nicht implementiert wurde, wird eine NotImplementedError-Fehlermeldung angezeigt. Dieser Fehler kann uns verwirren, da er uns nicht klar sagt, wie wir ihn beheben können. In diesem Artikel untersuchen wir die Ursachen von NotImplementedError und stellen einige Lösungen bereit, die Ihnen bei der Behebung dieses Fehlers helfen.

  1. Was ist NotImplementedError?

NotImplementedError ist eine der integrierten Ausnahmen von Python und stellt eine nicht implementierte Methode oder Operation dar. Normalerweise erscheint diese Art von Fehlermeldung bei nicht implementierten Methoden in abstrakten Klassen oder Schnittstellen und erinnert Programmierer daran, dass sie verwandte Funktionen implementieren müssen.

Eine abstrakte Klasse in Python ist eine spezielle Klasse, die nicht instanziiert und nur vererbt werden kann. Methoden in abstrakten Klassen haben normalerweise nur Namen und Parameter, aber keine Implementierung. Diese Methoden müssen von Unterklassen überschrieben werden, um die tatsächliche Funktionalität zu erhalten.

In Python können wir die ABC-Bibliothek verwenden, um abstrakte Klassen und Schnittstellen zu definieren. Wenn wir nicht alle abstrakten Methoden der übergeordneten Klasse in der untergeordneten Klasse implementieren, wird beim Versuch, diese Methoden aufzurufen, eine NotImplementedError-Ausnahme ausgelöst.

  1. Wie löst man NotImplementedError?

(1) Nicht implementierte Methoden implementieren

Wenn eine NotImplementedError-Ausnahme auftritt, besteht die einfachste Lösung darin, die entsprechende Methode entsprechend der Fehleraufforderung zu implementieren. Wenn wir beispielsweise eine Methode foo() verwenden, die nicht implementiert ist, können wir diese Methode im Code implementieren und das Programm erneut ausführen.

(2) Platzhalter verwenden

Wenn wir eine Klasse oder Schnittstelle entwerfen, kann es vorkommen, dass wir Methoden reservieren müssen, aber die spezifische Implementierung nicht kennen. Zu diesem Zeitpunkt können wir Platzhalter verwenden, um die Implementierung der Methode vorübergehend zu ersetzen. In Python können wir das Schlüsselwort pass verwenden, um Platzhalter zu implementieren.

Angenommen, wir haben eine abstrakte Klasse Animal, die eine eat()-Methode enthält:

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def eat(self):
        pass

In diesem Beispiel verwenden wir pass, um die Implementierung der eat-Methode vorübergehend zu ersetzen. Wenn wir eine Unterklasse implementieren und die Eat-Methode überschreiben müssen, können wir pass löschen und den entsprechenden Code implementieren.

(3) Überladen von Basisklassenmethoden

Wenn wir die abstrakte Methode oder Schnittstelle in der übergeordneten Klasse in der Unterklasse nicht implementieren können, können wir eine Überladung der Basisklassenmethode in Betracht ziehen. Überladung bezieht sich auf eine Methode, die in einer Unterklasse neu definiert wird und denselben Namen wie die Methode in der Basisklasse hat, sich aber anders verhält.

Zum Beispiel haben wir eine abstrakte Klasse namens Shape, die eine abstrakte Methode namens area() enthält. Wir können die Bereichsmethode in Unterklassen überladen und zugehörige Logik implementieren.

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass
    
class Circle(Shape):
    def __init__(self, r):
        self.radius = r
        
    def area(self):
        return 3.14 * self.radius * self.radius

In diesem Beispiel haben wir eine Unterklasse namens Circle erstellt und die Flächenmethode in der Shape-Klasse überladen. Selbst wenn die Area-Methode in der Shape-Klasse keine konkrete Implementierung hat, können wir daher die Methode im Circle-Objekt aufrufen und sie wird normal ausgeführt.

(4) Verwenden Sie raise NotImplementedError

In einigen Fällen möchten wir möglicherweise keine bestimmte Methode in einer Unterklasse implementieren, sondern beim Aufruf eine NotImplementedError-Ausnahme auslösen. In diesem Fall können wir das Schlüsselwort raise verwenden, um eine Ausnahme auszulösen.

Zum Beispiel haben wir eine Datenbankklasse, die eine Verbindungsmethode enthält, und wir möchten, dass beim Instanziieren des Objekts, wenn keine Parameter übergeben werden, eine NotImplementedError-Ausnahme ausgelöst wird:

class Database:
    def __init__(self, host=None, port=None):
        if host is None and port is None:
            raise NotImplementedError("Database connection details not provided")
        self.host = host
        self.port = port
        
    def connect(self):
        # connect to database using host and port
        pass

In diesem Beispiel, wenn wir es versuchen Wenn beim Konvertieren des Datenbankobjekts keine Parameter angegeben werden, wird eine NotImplementedError-Ausnahme ausgelöst.

Zusammenfassend lässt sich sagen, dass NotImplementedError eine häufige Ausnahme in der Python-Programmierung ist und normalerweise mit nicht implementierten Methoden in abstrakten Klassen oder Schnittstellen zusammenhängt. Gemäß der Philosophie von Python „verwenden Sie Fehlermeldungen, um Programmierer daran zu erinnern, dass sie gegen einen Vertrag verstoßen haben“. Daher sollten wir lernen, NotImplementedError-Ausnahmen aufzulösen und versuchen, diese Situation in unseren Programmen zu vermeiden.

Das obige ist der detaillierte Inhalt vonNotImplementedError: Wie behebe ich den Fehler einer nicht implementierten Python-Methode?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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