0

このコードがあるとしましょう:

models.py :

class Square:
  def __init__(self, name, value):
    self._name = name
    self._value = value

mymodule.py :

from models import Square
Square('hello', 'there')

main.py

m = __import__('mymodule')
for i in dir(m):
  if i == 'Square':
     models.append(getattr(m, i))

私の質問は、追加した Square をインスタンス化するにはどうすればよいですか (もちろん、mymodule.py で指定した引数を使用して)。

アイデアは、後で Square をインスタンス化することです。

ありがとう!

4

3 に答える 3

2

mymodule.pyファイルに欠陥があります。インスタンスを保存することはありません。変数に格納します。

somevariable = Square('hello', 'there')

コンストラクターを呼び出してぶら下げることはできません。

mymodule名前付きのものを探す属性をループしても、必要なものSquareは得られません。インスタンスではなく、クラス参照が見つかります。

Squareおそらく、代わりに次のタイプのオブジェクトを探す必要があります。

from models import Square

for value in vars(m).itervalues():
    if isinstance(value, Square):
         models.append(value)

クラスをインポートする必要を避けたい場合はSquare、代わりに型名をテストする必要がありますが、これはより脆弱です。

for value in vars(m).itervalues():
    if getattr(type(value), '__name__', None) == 'Square':
         models.append(value)

構築を本当に延期したい場合は、事前設定された値のセットで後で構築する代わりに、次を使用しますfunctools.partial()

from models import Square
from functools import partial

somevariable = partial(Square, 'hello', 'there')

これをインポートsomevariableして呼び出すと、パーシャルは既に渡された引数を適用してインスタンスを作成します。

instance = somevariable()  # calls Square('hello', 'there')
于 2013-02-12T22:39:24.877 に答える
0

実際にmymodule.pyでインスタンス化していますが、破棄されます。それを止めるには、そこに作成されたものを名前の付いたものに保存する必要がありますSquare。そうしないと、何も参照されないため、ガベージコレクションされます。これが私が意味することです:

mymodule.py:

from models import Square
a_square = Square('hello', 'there') # name it

次に、次のようにmain.pyでその名前を使用して、直接かつ迅速にアクセスできます。

main.py

models = []
mod = __import__('mymodule')
models.append(vars(mod)['a_square'])  # access it by name
于 2013-02-12T23:27:34.770 に答える