2

type値が「MBSquareObject」の文字列があります。MBSquareObjectと呼ばれるファイルのクラスですMBObjectMBSquareObject動的にインポートしたい。

正方形のオブジェクトがそれ自体のファイルにある場合、これは機能します。

__import__(type)

しかし、私がやりたいのは。と同等ですfrom MBObject import MBSquareObject。ただし、これは機能しません。

from MBObject __import__(type)

他にどのように私はこれを行うことができますか?

編集:与えられた答えは、MBSquareObjectがMBObject上のある種のオブジェクトであると想定していますが、それは単なる別のクラスです。MBSquareObjectはMBObjectのサブクラスであるため、同じファイルにリストされています。

編集:何らかの理由で、どの答えも機能していません。これが私が持っているものです:

# this is imported at the top of the file
from MBObject import MBObject
type = 'MBSquareObject'
__import__('MBObject', globals(), locals(), [type])
object_class = eval(type)
object = object_class()

エラー:NameError:名前'MBSquareObject'が定義されていません

4

5 に答える 5

4

あなたの例は、モジュール名MBObjectに動的にアクセスする必要はなく、内部のオブジェクトにのみアクセスする必要があることを示しています。その場合、あなたはただすることができます

import MBObject
thing  = getattr(MBObject, type)

編集:1つの問題は、モジュールとクラスに同じ名前を付けているため、コード内でそれらを区別するのが難しいことです。クラスとモジュールの間で混乱しています。MBObjectと呼ばれるものが2つあります。1つはモジュールで、もう1つはそのモジュール内のクラスです。を行う場合from MBObject import MBObject、クラスをインポートしますが、モジュールへの参照を自分自身に与えないため、同じモジュールから2番目のクラス(MBSquartObject)を後でインポートするのは面倒です。

上記のコードを使用することで、必要な効果を得ることができますが、実行してはなりませfrom MBObject import MBObject---実行するときは、モジュールへの参照を指定せず、そのモジュール内のクラスのみを指定します。代わりに、を実行してimport MBObjectから、を介してMBObjectクラスにアクセスしてくださいMBObject.MBObject

モジュール名を前に付けずに、同じモジュールからMBObjectクラスと他のクラスの両方を参照できるようにする場合は、モジュールに別の名前を付けます。Pythonスタイルガイドラインは、MixedCaseのすべての小文字とクラスでモジュールに名前を付けることを推奨しています。したがって、モジュールにmbobject.pyという名前を付けます。次に、次のことができます。

import mbobject
from mbobject import MBObject
thing = getattr(mbobject, type)

一般に、Pythonでは、モジュールとクラスに同じ名前を付けることはお勧めできません。モジュールとクラスは別のものであり、同じ名前を付けると、このような混乱を招き、モジュールとクラスのどちらを扱っているのかが明確になりません。

于 2012-11-12T23:41:30.583 に答える
3

__import__インポートするオブジェクトを正確に指定する追加の引数を取ることができます。この関数の戻り値から、必要なオブジェクトをフェッチできます。

source_module = 'MBObject'
object_in_module = 'MBSquareObject'

obj = getattr(__import__(source_module, globals(), locals(), [object_in_module]),
              object_in_module)
于 2012-11-12T23:43:59.970 に答える
1

これを試して:

module = __import__('MSObject', globals(), locals(), ['MBSquareObject'], -1)

ここにある例を使用して接続します。

http://docs.python.org/2/library/functions.html# import

于 2012-11-12T23:44:18.333 に答える
1

__import__関数の完全な構文は、ドキュメントで説明されています。

 __import__(name[, globals[, locals[, fromlist[, level]]]])

fromlistインポートされたモジュールからインポートするアイテムのリストは次のとおりです。次のようなステートメント

 from module import object1, object2

のようなものとして実装されています

module = __import__('module', globals(), locals(), ['object1', 'object2'])
object1 = getattr(module, 'object1')
object2 = getattr(module, 'object2')

だからあなたの場合、あなたは使うことができます

module = __import__('MBObject', globals(), locals(), [type])
the_object = getattr(module, type)

Pythonの最近のバージョンでは、3.1以降、importlibこれを行うためにおそらく使用できるモジュールがあります。私が見つけることができる唯一の方法は、モジュールのの実装を使用することですが__import__、これは基本的に組み込みの実装と同じなので、組み込みの実装を使用した方がよいと思います。

于 2012-11-12T23:49:16.847 に答える
0

どうですか:

module = __import__('MSObject.' + 'MBSquareObject')
于 2012-11-12T23:41:17.690 に答える