Ausführliche Erläuterung der Verwendung von Code zum dynamischen Erstellen von Klasseninstanzen in Python

高洛峰
Freigeben: 2017-03-26 10:07:53
Original
1674 Leute haben es durchsucht

In Java können wir durch Reflektion Klasseninstanzen basierend auf Klassennamen erstellen. Wie können wir also ähnliche Funktionen in Python erreichen? Tatsächlich gibt es in Python einen integrierten Funktionsimport. Mit dieser Funktion können wir einige Module zur Laufzeit dynamisch laden

Einführung

In Java Wir können durch Reflektion Klasseninstanzen basierend auf Klassennamen erstellen. Wie erreichen wir also ähnliche Funktionen in Python?

Tatsächlich gibt es in Python eine integrierte Funktion zum Importieren. Mit dieser Funktion können wir einige Module zur Laufzeit dynamisch laden. Wie folgt:


def createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
  return obj
Nach dem Login kopieren

Beispiel

Zuerst erstellen wir ein Verzeichnis my_modules, das drei Dateien enthält

* init.py: Moduldatei
* my_module.py: Modul zum Testen
* my_another_module: ein weiteres Modul zum Testen

my_module.py


from my_modules.my_another_module import *
class MyObject(object):
  def test(self):
    print 'MyObject.test'
    MyObject1().test()
    MyObject2().test()
    MyAnotherObject().test()
class MyObject1(object):
  def test(self):
    print 'MyObject1.test'
class MyObject2(object):
  def test(self):
    print 'MyObject2.test'
Nach dem Login kopieren

my_another_module.py


class MyAnotherObject(object):
  def test(self):
    print 'MyAnotherObject.test'
Nach dem Login kopieren

test.py


def createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
  return obj
obj = createInstance("my_modules.my_module", "MyObject")
obj.test()
MyObject.test
MyObject1.test
MyObject2.test
MyAnotherObject.test
Nach dem Login kopieren

Pyinstaller-Integration

Wenn Sie bei mit Pyinstaller gepackten Anwendungen den obigen Code verwenden, tritt nach dem Ausführen des Pakets der folgende Fehler auf wird im Programm auftreten


Traceback (most recent call last):
 File "test.py", line 12, in <module>
  obj = createInstance("my_modules.my_module", "MyObject")
 File "test.py", line 7, in createInstance
  module_meta = __import__(module_name, globals(), locals(), [class_name])
ImportError: No module named my_modules.my_module
Failed to execute script test
Nach dem Login kopieren

Der Grund für den Fehler hier ist, dass Pyinstaller beim Packen der Analyseklasse die Module unter my_modules nicht analysiert hat, sodass ein Fehler gemeldet wurde beim Laufen.

Lösung 1:

Importieren Sie das Modul manuell unter my_modules in test.py, siehe erste Zeile im Code unten. Diese Methode ist die einfachste, aber offensichtlich nicht sehr gut.


import my_modules.my_module
def createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
  return obj
obj = createInstance("my_modules.my_module", "MyObject")
obj.test()
Nach dem Login kopieren

Lösung 2:

Wenn Sie Pyinstaller zum Paketieren verwenden, geben Sie „– versteckt-“ an. import“, wie folgt


pyinstaller -D --hidden-import my_modules.my_module test.py
Nach dem Login kopieren

Lösung 3:

Dynamische Änderung der Python-Ausführung Wann Es geht um den Pfad, siehe die ersten beiden Zeilen im Code unten, wo wir den Pfad über Umgebungsvariablen oder Parameter übergeben können. Offensichtlich ist diese Methode viel flexibler als die ersten beiden Methoden.


import sys
sys.path.append(...)
def createInstance(module_name, class_name, *args, **kwargs):
  module_meta = __import__(module_name, globals(), locals(), [class_name])
  class_meta = getattr(module_meta, class_name)
  obj = class_meta(*args, **kwargs)
  return obj
obj = createInstance("my_modules.my_module", "MyObject")
obj.test()
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Verwendung von Code zum dynamischen Erstellen von Klasseninstanzen in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!