コードを使用して Python でクラス インスタンスを動的に作成する方法の詳細な説明

高洛峰
リリース: 2017-03-26 10:07:53
オリジナル
1723 人が閲覧しました

Java では、リフレクションを通じてクラス名に基づいてクラス インスタンスを作成できますが、Python で同様の機能を実現するにはどうすればよいでしょうか?実際、Python には組み込み関数 import があり、この関数を使用して実行時にいくつかのモジュールを動的にロードできます。

実際、Python には組み込み関数 import があり、この関数を使用して実行時にいくつかのモジュールを動的にロードできます。以下の通り:

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
ログイン後にコピー

まず、3つのファイルを含むディレクトリmy_modulesを作成します

* init.py: モジュールファイル

* my_module.py: テスト用モジュール
* my_another_module: テスト用の別のモジュール

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'
ログイン後にコピー

my_another_module.py


class MyAnotherObject(object):
  def test(self):
    print 'MyAnotherObject.test'
ログイン後にコピー

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
ログイン後にコピー

pyinstallerの統合


pyinstallerアプリケーションを使用してパッケージ化されたものについては、上記のコードを使用すると、パッケージ化されたプログラムを実行するときに次のエラーが表示されます

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
ログイン後にコピー
ここでのエラーの理由は、pyinstaller が分析クラスをパッケージ化するときに my_modules の下のモジュールを分析しなかったため、エラーが報告されたことです。走っているとき。

解決策 1:


test.py の my_modules の下にモジュールを手動でインポートします。以下のコードの最初の行を参照してください。この方法は最も単純ですが、明らかにあまり良い方法ではありません。

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()
ログイン後にコピー

解決策 2:


pyinstaller を使用してパッケージ化する場合は、次のように「--hidden-import」を指定します

pyinstaller -D --hidden-import my_modules.my_module test.py
ログイン後にコピー

解決策 3:

動的変更Pythonランタイム パスについては、以下のコードの最初の 2 行を参照してください。ここでは、環境変数またはパラメーターを通じてパスを渡すことができます。明らかに、この方法は最初の 2 つの方法よりもはるかに柔軟です。


りー

以上がコードを使用して Python でクラス インスタンスを動的に作成する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート