it-swarm.dev

Was ist dynamischer Versand und Entenschreiben?

Bei der Verwendung von Pycharm wird häufig auf einen Fehler hingewiesen:

Nicht aufgelöster Verweis "Name". Diese Inspektion erkennt Namen, die Entschließe, aber nicht. Aufgrund dynamischer Versand- und Ententypisierung ist dies in einer begrenzten, aber nützlichen Anzahl von Fällen möglich. Top-Level und Elemente auf Klassenebene werden besser unterstützt als Instanzelemente.

Ich habe herumgepfuscht, aber die meisten Fragen und Informationen, die ich finde, betreffen das Verhindern, dass die Nachricht angezeigt wird. was ich wissen will ist:

  • Was ist dynamisches Versenden/Entenschreiben?
  • Was sind (oder ein Beispiel) für diese "nützliche Anzahl von Fällen"?
4
Rick M.

Python verwendet eine Konvention für die Eingabe von Enten. Das bedeutet, dass Sie nicht angeben müssen, um welche Art von Namen es sich handelt. Anders als in Java zum Beispiel, wo Sie explizit angeben müssen, dass die Variable vom Typ int oder Object sein kann. Die Überprüfung der Typen erfolgt im Wesentlichen zur Laufzeit.

"Wenn es wie eine Ente geht und quakt wie eine Ente, dann muss es eine Ente sein."

In Python scheint alles zu funktionieren, bis Sie versuchen, ein Objekt auf eine Weise zu manipulieren, auf die es nicht ausgelegt ist. Grundsätzlich verfügt ein Objekt möglicherweise nicht über eine bestimmte Methode oder ein bestimmtes Attribut, das von einem anderen verwendet werden kann, und Sie werden dies erst feststellen, wenn Python beim Versuch einen Fehler ausgibt.

Dynamic Dispatch ist die Praxis des Compilers oder der Umgebung, in der festgelegt wird, welche Version einer polymorphen Funktion zur Laufzeit verwendet werden soll. Wenn Sie mehrere Implementierungen einer Methode haben, können Sie diese auf unterschiedliche Weise verwenden, obwohl die Methoden die gleichen oder ähnliche Eigenschaften/Attribute aufweisen. Hier ist ein Beispiel:

class Foo:
   def flush():
       pass

class Bar:
    def flush():
       pass

Beide Klassen verfügen über eine flush()-Methode, der richtige Name wird jedoch zur Laufzeit ausgewählt.

Python ist nicht das beste Beispiel für diesen Prozess, da Methoden mehrere Parameter annehmen können und nicht erneut implementiert werden müssen. Java ist ein besseres Beispiel, aber ich bin nicht fließend genug, um ein korrektes Beispiel zu geben.

3
smallpants

Die Warnung bedeutet, dass Sie eine Variable verwenden, die von PyCharm nicht erkannt wird. Aufgrund der dynamischen Natur von Python ist es jedoch nicht sicher, ob sie richtig ist oder nicht.

Beispielsweise haben Sie möglicherweise folgenden Code:

class myClass():

    def myfunc(self):
        print(self.name)

PyCharm wird sich wahrscheinlich darüber beschweren, dass self.name nicht aufgelöst werden kann. Sie können die Klasse jedoch folgendermaßen verwenden:

my_class = myClass()
my_class.name = "Alastair"
my_class.myfunc()

das ist vollkommen gültig (wenn auch spröde).

In der Nachricht heißt es, dass Attribute und Methoden, die weniger eindeutig sind, sicherer sind. Zum Beispiel:

class myClass():
    my_instance_var = "Al"

    def myfunc(self):
        print(self.my_instance_var)

Da my_instance_var im Quellcode (ein Klassenattribut) definiert ist, kann sich PyCharm darauf verlassen, dass es existiert.

(Verwenden Sie keine Klassenattribute, wenn Sie nicht wissen, was Sie tun!)

1