0

私がやろうとしているのは、クラスを使用してモジュールを作成することです。そして、そのクラスのインターフェースである関数。この関数のオンザフライの変数名は、そのクラスのインスタンスを指しています。この関数とクラス自体は別のモジュールにあり、それらの使用法は別のPythonファイルにある必要があります。

私のコードを見ていると、私がやろうとしていることを理解するのがはるかに簡単だと思います。

これはfirst.py

class FirstClass:
    def setID(self, _id):
        self.id = _id
    def func(self):
        pass

# An 'interface' for FirstClass
def fst(ID):
    globals()['%s' % ID] = FirstClass(ID)
    return globals()['%s' % ID]

さて、私がすぐに呼び出している場合fst('some_text')first.py結果は私が夢見ていたものとほぼ同じです。後で、私が書くときはいつでも、のインスタンスを指しているのでsome_text.func()、それはを呼び出します。func()some_textFirstClass

しかし、second.pyが次のような場合:

from first import fst

fst('sample_name')
sample_name.func()

次に、Pythonからの答えは次のようになります。

NameError: name 'sample_name' is not defined.

どちらがやや合理的です..だから私の質問は:これを行うための「よりきれいな」方法または完全に異なる方法がありますか?または、これを行うためにコード内の小さなものを変更する必要がありますか?

ありがとうございました!

4

1 に答える 1

2

関数でグローバルとして設定しないでください。代わりに、関数から新しいインスタンスを返し、グローバルをその戻り値に設定するだけです。

def fst(ID):
    return FirstClass(ID)

その後second.py

sample_name = fst('sample_name')

ここで、関数内の場合は、を宣言sample_nameglobalます。

このglobals()メソッドは、呼び出したモジュールのグローバルのみを返します。関数を呼び出しているもののグローバルを返すことはありません。これらのグローバルにアクセスする必要があると感じた場合は、コードを再考してください。関数を呼び出しているもののグローバルを変更する必要はほとんどありません。

呼び出し元のグローバルにアクセスする必要があると確信している場合は、スタックフレームを使用してハッキングを開始する必要があります。

# retrieve caller globals
import sys
caller_globals = sys._getframe(1).f_globals

しかし、州の文書としてsys._getframe()

CPython実装の詳細:この関数は、内部および特殊な目的でのみ使用する必要があります。Pythonのすべての実装に存在することが保証されているわけではありません。

于 2013-03-25T10:08:47.530 に答える