2017-03-09 20 views
0

へのインポート、私はクラスのpython:クラスの名前空間

class TranformerTestInit(unittest.TestCase): 
    def __init__(self): 
     pass 
私はそれがそのクラスにのみ表示されていること

from regional_pos_tranformer import regional_pos 

のでステートメントを追加する必要があり

全体ではなく、モジュールを使用している場合は?

+4

なぜこのようにする必要があるのですか? – stybl

+0

また、できません。あなたは実行を遅らせることができますが、最終的に 'import'はファイルを' exec'するための素晴らしい方法です。 –

+0

"モジュール全体ではなく、そのクラスだけが見ることができるように" - そのようなスコープはPythonには存在しません。クラス定義を関数の中にネストすることで、このようなスコープでクラッシュすることができますが、実際にはそうすべきではありません。モジュール全体に見えるようにするだけです。 – user2357112

答えて

0

クラススコープに入れてください。たとえば、行の真上で、同じインデントで入力してください。 self.regional_posまたはcls.regional_posclsTranformerTestInitにバインドされていることを前提とします)となります。

モジュールのdir()には表示されませんが、それでも直接アクセス:TranformerTestInit.regional_posでアクセスできます。

インポートするものは、インスタンスで呼び出されたときに最初のパラメータとしてselfを渡すことで、クラス内で実際に定義されている他の関数、クラス、またはデータ構造と同様に扱われることに注意してください。 staticmethodで関数をラップすることはできますが、クラスを作成する際に関数を呼び出すことは機能しません。 あなたがそれを行うことができる間に、それはおそらく努力の価値がありません。


単にクラスで最後のものというあなたを作るクラスの作成時にstaticmethod頭痛を避けるために:ちょうどアンダースコアでモジュールレベルと接頭辞でインポートする

class SomeThing: 
    from stdlib import widget 
    ... 
    fancy = widget(...) 
    ... 
    widget = staticmethod(widget) 

簡単:

from stdlib import widget as _widget 
+0

'regional_pos'がディスクリプタである場合、' self.regional_pos'または 'TransformerTestInit.regional_pos'へのアクセスはディスクリプタプロトコルを有効にするので、見た目よりもエラーが発生しやすくなります。これは特にPython 2で問題を引き起こす可能性が高いですが、Python 3でも、 'self.regional_pos'は' regional_pos'関数ではなくバインドされたメソッドオブジェクトになるでしょう。 – user2357112

+0

@ user2357112:良い点、更新された回答。 –

関連する問題